繁体   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