Python的继承和多态
我们不会每次从0开始创建一个类,而是尽可能从已有的类中继承,减少工作量,又易于维护
子类会直接拥有父类的属性和方法
class Person:
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def showName(self):
print('我叫' + self.name)
def showAge(self):
print('我今年' + str(self.age))
class Worker(Person):
job = ''
def __init__(self, name, age, job):
super().__init__(name, age)
self.job = job
def showJob(self):
print('我的工作是' + self.job)
w = Worker('张三', 35, "底层打工人")
w.showName()
w.showAge()
w.showJob()
super 关键字
用于访问父类的成员
本质上,super访问的是对象的MRO表(Method Resolution Order-成员解析表) 不带参数时,只是简单的返回父类
若带有参数,其实是返回MRO的下一级
多重继承(简单了解)
从多个父级同时继承。
- 支持的:c++ python
- 不支持的:java c# php ruby …
多重继承会导致混乱和歧义,所以大多数语言并不支持
所有的都是Object的子类
多父级可能会有同名属性冲突(先出现就是谁)
class p1:
name = 'p1'
class p2:
name = 'p2'
class Child(p1, p2): # p1 返回前面的
def __init__(self):
print(self.name)
c = Child()
重写父级方法
父类的方法会直接继承给子类,但也可以在子类中覆盖掉父级的方法,只要子类的签名(方法名、参数)相同就可以
父类的方法并没有消失,只是被子类隐藏了,我们可以调用他的super() 访问到
isinstance(obj,class) 函数
用于检测是否是一个类的实例
l=[1,2,3]
print(isinstance(l,list))
print(isinstance(l,object)) #什么都来自object 都是object的子类 顶级父级