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

上一篇下一篇

猜你喜欢

热点阅读