簡體   English   中英

在沒有基類的情況下調用 super()

[英]Calling super() without a base class

我正在閱讀 O Reilly Python Cookbook,並且一直在努力使用以下代碼。 這是使用super()在父類上調用方法:

class Proxy:
    def __init__(self, obj):
        self._obj = obj

    # Delegate attribute lookup to internal obj
    def __getattr__(self, name):
        return getattr(self._obj, name)

    # Delegate attribute assignment
    def __setattr__(self, name, value):
        if name.startswith('_'):
            super().__setattr__(name, value)    # Call original __setattr__
        else:
            setattr(self._obj, name, value)

if __name__ == '__main__':
    class A:
        def __init__(self, x):
            self.x = x
        def spam(self):
            print('A.spam')

    a = A(42)
    p = Proxy(a)
    print(p.x)
    print(p.spam())
    p.x = 37
    print('Should be 37:', p.x)
    print('Should be 37:', a.x)

書中指出:

在此代碼中, __setatrr__()的實現包括名稱檢查。 如果名稱以下划線開頭,它將使用super()調用__setattr__()的原始實現。 否則,它委托給內部持有的對象self._obj

我很迷惑。 如果沒有列出明確的基類,那么super()如何工作? 那么super()究竟指的是什么?

總有一個基類; 沒有明確提及, Proxy直接從object繼承。

每個類定義一個方法解析順序,由其基類及其祖先遞歸確定。 super()被調用時,它會解析為self的 MRO 中下一個類的“代理”,無論該類是否出現在您當前定義的類的 MRO 中。

考慮以下類:

class A:
    def foo(self):
        print("A.foo")


class B(A):
    def foo(self):
        super().foo()
        print("B.foo")


class C(A):
    def foo(self):
        super().foo()
        print("C.foo")


class D(C):
    def foo(self):
        super().foo()
        print("D.foo")


class E(B,D):
    def foo(self):
        super().foo()
        print("E.foo")

e = E()

E的 MRO 是[E, B, D, C, A, object] 當您調用e.foo() ,您e.foo() MRO 順序啟動一系列調用。 特別是,在B.foo中對super的調用不會調用A.foo ,而是D.foo ,類B一個方法一無所知,因為D不是B的祖先。 但是BD都是E祖先,這很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM