1、子类自己没有的方法、属性如果父类有,子类可以调用父类的方法和属性使用;
class Animal():
def __init__(self,name):
self.name = name
print(self.name)
d
ef greet(self):
print('hello, i am %s' % self.name)
class Dog(Animal):
pass
dog = Dog('dog')
dog.greet()
print(dog.name)
输出:
dog
hello, i am dog
dog
2、子类和父类共有的属性和方法,这时子类想要调用共有的属性和方法需要用到super;
class Animal():
def __init__(self,name): #构造函数称作属性
self.name = name
print(self.name)
def greet(self): #方法
print('hello, i am %s' % self.name)
class Dog(Animal):
def __init__(self,name):
super().__init__(name)
self.name = 3
def greet(self):
super().greet()
print('wang wang')
dog = Dog('dog')
dog.greet()
print(dog.name)
输出:
dog
hello, i am 3
wang wang
3
3、多继承中super的使用;
看了上面的使用,你可能会觉得 super
的使用很简单,无非就是获取了父类,并调用父类的方法。其实,在上面的情况下,super 获得的类刚好是父类,但在其他情况就不一定了,super 其实和父类没有实质性的关联。
class Base(object): def __init__(self): print ("enter Base") print ("leave Base") class A(Base): def __init__(self): print ("enter A") super(A, self).__init__() #python3 可以使用super().__init__() print ("leave A") class B(Base): def __init__(self): print ("enter B") super(B, self).__init__() print ("leave B") class C(A, B): def __init__(self): print ("enter C") super(C, self).__init__() print ("leave C") c = C() print(C.mro())
输出:
enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
事实上,对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序,我们可以使用下面的方式获得某个类的 MRO 列表:
>>> C.mro() # or C.__mro__ or C().__class__.mro()
[__main__.C, __main__.A, __main__.B, __main__.Base, object]
那这个 MRO 列表的顺序是怎么定的呢,它是通过一个 C3 线性化算法来实现的,这里我们就不去深究这个算法了,感兴趣的读者可以自己去了解一下,总的来说,一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:
- 子类永远在父类前面
- 如果有多个父类,会根据它们在列表中的顺序被检查
- 如果对下一个类存在两个合法的选择,选择第一个父类