首页 > 解决方案 > 在 Python 3 中使用带有单个参数的 super()

问题描述

我阅读了很多关于正确使用super带和不带参数的材料,但仍有一些我不明白的地方。

让我们考虑以下示例:

class A:
    def foo(self):
        pass

class B(A):
    pass

这是我理解的部分:

super(B, B())  # <bound method A.foo of <__main__.B object at ...>>

这是有道理的,作为 的两个参数版本super,第二个参数是一个对象返回一个绑定对象。

假设我想访问 中的函数A,而不是绑定方法。我会试试这个:

super(B).foo  # AttributeError: 'super' object has no attribute 'foo'

这是我不明白的部分。

但是,尝试以super以下方式“欺骗”是可行的:

super(B, B).foo  # <function __main__.A.foo(self)>

我错过了什么?

标签: pythonpython-3.xsuper

解决方案


super返回某个对象的代理。要确定要代理哪个对象,您需要了解如何在不使用super.

Ifa是 的一个实例,则为Aa.foo提供 的返回值A.__dict__['foo'].__get__(a, A),它是 的一个实例method。要获取函数本身,请使用A.foo,这是 的返回值A.__dict__['foo'].__get__(None, A)

这表明您需要的代理,而不是类的实例,这就是为什么您将A而不是 的实例A作为 的第二个参数传递给super.


推荐阅读