python-super()
2019-01-31 本文已影响0人
科技瞭望台
参考地址:https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods
使用super()可以避免显式引用基类,但主要优势在于
1、
第一种多继承中的解释:
协作多重继承的子类能够正确的从方法解析顺序(MRO)中调用下一个父类方法。
ChildB使用super,ChildA不使用:
class Base(object):
def __init__(self):
print("Base init'ed")
class ChildA(Base):
def __init__(self):
print("ChildA init'ed")
Base.__init__(self)
class ChildB(Base):
def __init__(self):
print("ChildB init'ed")
super(ChildB, self).__init__()
创建一个我们希望在Child之后调用的依赖项:
class UserDependency(Base):
def __init__(self):
print("UserDependency init'ed")
super(UserDependency, self).__init__()
class UserA(ChildA, UserDependency):
def __init__(self):
print("UserA init'ed")
super(UserA, self).__init__()
class UserB(ChildB, UserDependency):
def __init__(self):
print("UserB init'ed")
super(UserB, self).__init__()
>>> UserA()
UserA init'ed
ChildA init'ed
Base init'ed
<__main__.UserA object at 0x0000000003403BA8>
>>> UserB()
UserB init'ed
ChildB init'ed
UserDependency init'ed
Base init'ed
<__main__.UserB object at 0x0000000003403438>
继承关系图
inherit .png
从调用结果中可以看出,多继承中,由于ChildA没有使用super,ChildB使用了super,因此,ChildA不会调用所有的父类方法即不会调用UserDependency,而ChildB调用了所有的父类方法。
2、
第二种调用父类的方法的解释
参考地址:https://python3-cookbook.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.html