我在检查如何使用super
时发现了这个怪癖。
In [1]: super?
Init signature: super(self, /, *args, **kwargs)
Docstring:
super() -> same as super(__class__, <first argument>)
...
请注意,第一个示例直接使用__class__
。
以某种方式,__class__
可以在实例方法中使用:
class Test():
def __init__(self):
print(__class__)
def foo(self):
print(__class__)
def bar(self):
print(bar)
t = Test() # <class '__main__.Test'>
t.foo() # <class '__main__.Test'>
t.bar() # NameError: name 'bar' is not defined
谁能解释为什么会这样?
答案 0 :(得分:0)
因此,编译器查找父类是一个怪癖。
如果类主体中的任何方法引用__class__或super,则__ class__是编译器创建的隐式闭包引用。这个 允许super()的零参数形式正确识别 类是根据词法作用域定义的,而类或 用于进行当前呼叫的实例是基于 传递给该方法的第一个参数。