8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Python 的 super() 如何与多重继承一起工作?

peterjwest 1月前

170 0

super() 如何与多重继承一起工作?例如,给定:class First(object): def __init__(self): print \'first\'class Second(object): def __init__(self): ...

如何 super() 处理多重继承?例如,给定:

class First(object):
    def __init__(self):
        print "first"

class Second(object):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        super(Third, self).__init__()
        print "that's it"

引用了 Third 哪个父方法 super().__init__ ?我可以选择运行哪个吗?

有关 MRO

帖子版权声明 1、本帖标题:Python 的 super() 如何与多重继承一起工作?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由peterjwest在本站《oop》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 全面的

    假设所有内容都来自 object (如果不是,则您自己决定),Python 会根据您的类继承树计算方法解析顺序 (MRO)。MRO 满足 3 个属性:

    • 班级的孩子比父母先到
    • 左父母先于右父母
    • 一个类在 MRO 中只出现一次

    如果不存在这样的顺序,Python 会出错。其内部工作原理是类祖先的 C3 线性化。在此处阅读所有内容: https://www.python.org/download/releases/2.3/mro/

    调用某个方法时,将调用 MRO 中第一次出现的该方法。任何未实现该方法的类都会被跳过。 super 对该方法的任何调用都将调用 MRO 中下一次出现的该方法。因此,将类置于继承中的顺序以及将调用置于 super 方法中的位置都很重要。

    注意,你可以使用该方法在python中查看MRO __mro__

    示例

    下面所有的例子都有菱形的类继承,像这样:

        Parent
        /   \
       /     \
    Left    Right
       \     /
        \   /
        Child
    

    MRO 是:

    1. 孩子
    2. 左边
    3. 正确的
    4. 父母

    您可以通过调用来测试这一点 Child.__mro__ ,它返回:

    (__main__.Child, __main__.Left, __main__.Right, __main__.Parent, object)
    

    每种方法都使用 super first

    class Parent(object):
        def __init__(self):
            super(Parent, self).__init__()
            print("parent")
    
    class Left(Parent):
        def __init__(self):
            super(Left, self).__init__()
            print("left")
    
    class Right(Parent):
        def __init__(self):
            super(Right, self).__init__()
            print("right")
    
    class Child(Left, Right):
        def __init__(self):
            super(Child, self).__init__()
            print("child")
    

    Child() 输出:

    parent
    right
    left
    child
        
    

    每个方法中 super 都有

    class Parent(object):
        def __init__(self):
            print("parent")
            super(Parent, self).__init__()
    
    class Left(Parent):
        def __init__(self):
            print("left")
            super(Left, self).__init__()
    
    class Right(Parent):
        def __init__(self):
            print("right")
            super(Right, self).__init__()
    
    class Child(Left, Right):
        def __init__(self):
            print("child")
            super(Child, self).__init__()
    

    Child() 输出:

    child
    left
    right
    parent
    

    当并非所有类都调用 super

    如果不是继承链中的所有类都调用,那么继承顺序就至关重要 super 。例如,如果 Left 永远不会调用 Right Parent 上的方法

    class Parent(object):
        def __init__(self):
            print("parent")
            super(Parent, self).__init__()
    
    class Left(Parent):
        def __init__(self):
            print("left")
    
    class Right(Parent):
        def __init__(self):
            print("right")
            super(Right, self).__init__()
    
    class Child(Left, Right):
        def __init__(self):
            print("child")
            super(Child, self).__init__()
    

    Child() 输出:

    child
    left
    

    或者,如果 Right 没有调用, super , Parent 仍然会跳过:

    class Parent(object):
        def __init__(self):
            print("parent")
            super(Parent, self).__init__()
    
    class Left(Parent):
        def __init__(self):
            print("left")
            super(Left, self).__init__()
    
    class Right(Parent):
        def __init__(self):
            print("right")
    
    class Child(Left, Right):
        def __init__(self):
            print("child")
            super(Child, self).__init__()
    

    这里 Child() 输出:

    child
    left
    right
    

    调用特定父级的方法

    如果要访问特定父类的方法,则应直接引用该类,而不是使用 super。Super 是遵循继承链,而不是获取特定类的方法。

    以下是如何引用特定父母的方法:

    class Parent(object):
        def __init__(self):
            super(Parent, self).__init__()
            print("parent")
    
    class Left(Parent):
        def __init__(self):
            super(Left, self).__init__()
            print("left")
    
    class Right(Parent):
        def __init__(self):
            super(Right, self).__init__()
            print("right")
    
    class Child(Left, Right):
        def __init__(self):
            Parent.__init__(self)
            print("child")
    

    在这种情况下, Child() 输出:

    parent
    child
    
返回
作者最近主题: