美文网首页
python-super()

python-super()

作者: 科技瞭望台 | 来源:发表于2019-01-31 16:58 被阅读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

    相关文章

      网友评论

          本文标题:python-super()

          本文链接:https://www.haomeiwen.com/subject/pcclsqtx.html