python - 在 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)>
我错过了什么?
解决方案
super
返回某个对象的代理。要确定要代理哪个对象,您需要了解如何在不使用super
.
Ifa
是 的一个实例,则为A
您a.foo
提供 的返回值A.__dict__['foo'].__get__(a, A)
,它是 的一个实例method
。要获取函数本身,请使用A.foo
,这是 的返回值A.__dict__['foo'].__get__(None, A)
。
这表明您需要类的代理,而不是类的实例,这就是为什么您将A
而不是 的实例A
作为 的第二个参数传递给super
.
推荐阅读
- java - 为什么 GregorianCalendar.getTimeInMillis() 和 GregorianCalendargetTimeInMillis(1970.01.01) 之间存在差异
- php - PHP无法访问开关内的公共变量
- javascript - 在 Polymer 中,我可以在单击时动态创建纸质按钮更改颜色吗?
- postgresql - Adobe Campaign 工作流结果:无法从基础读取数据
- r - 循环两个 R 数据帧以创建第三个数据帧
- jenkins - RTC 的提交后交付钩子
- node.js - 如何手动调用多个 express 中间件
- javascript - 遇到 2 个输出组合在一个输入中
- c# - 如何向网站发送登录请求?
- google-apps-script - 如何使用公式列出或索引 Google 表格中的所有工作表/标签(无脚本)