【问题标题】:Python multiple inheritance and MROPython 多重继承和 MRO
【发布时间】:2017-01-24 10:26:34
【问题描述】:

我目前正在学习 Python 考试,但我还不了解 Python 3 中的 MRO 和线性化。

class F: pass 
class G: pass 
class H: pass
class E(G,H): pass
class D(E,F): pass 
class C(E,G): pass
class B(C,H): pass
class A(D,B,E): pass

例如,在一个作业中,有一个问题,在 A 类的线性化中,E 是否可能出现在 C 之前。

如何确定是否可行?如何尽可能简单地描述线性化算法(C3)? 非常感谢您提供有关这方面的各种解释和资源,因为我很难理解 Python 中的线性化。

提前非常感谢!

【问题讨论】:

    标签: python python-3.x inheritance method-resolution-order


    【解决方案1】:

    Python 按 DFS 顺序而不是 BFS 查找父类或子类

    # This order is called Method Resolution Order (`mro()`)
    
    class A(object):
        def dothis(self):
            print('Doing this in A')
    
    class B(A):
        pass
    
    class C(object):
        def dothis(self):
            print('Doing this in C')
    
    class D(B, C):
        pass
    
    d_instance = D()
    d_instance.dothis()
    # METHOD RESOLUTION ORDER
    print(D.mro())
    
    '''
    OUTPUT:
    
    # Doing this in A
    # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]
    
        A
    
        |               C
    
        B(A)          /
            \
                D(B, C)
    
    RESOLUTION ORDER IS (DFS) = D-B-A-C
    
    
    
                 A
    
            /       \
    
        B(A)         C(A)
            \       /
                D(B, C)
    
    If the same class appears in mro, the earlier occurrences get removed
    D-B-A-C-A -> D-B-C-A, hence still a DFS
    RESOLUTION ORDER IS (In Diamond shape) = D-B-C-A
    
    
    '''
    

    【讨论】:

      【解决方案2】:

      E 类继承自 G 和 H。

      类 G 和 H 依赖(它们不从任何人继承)。

      因为E类对C类没有依赖关系,所以可以在他之前初始化

      【讨论】:

      • 当我调用 print(A.__mro__) C 出现在 E 之前。为什么?
      • @thedood 这是因为 C 类继承自 E 类。这意味着 C 类必须在 E 类之前初始化。总而言之,您可以在 C 类之前创建 E 类,但是当您创建 C 类时必须有 E 类,因为 E 类继承于 C 类
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2020-12-18
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2015-05-02
      相关资源
      最近更新 更多