为什么__class__可以直接访问

时间:2019-12-30 07:57:46

标签: python

我在检查如何使用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

谁能解释为什么会这样?

1 个答案:

答案 0 :(得分:0)

因此,编译器查找父类是一个怪癖。

来自Python Data Model

如果类主体中的任何方法引用__class__或super,则

__ class__是编译器创建的隐式闭包引用。这个 允许super()的零参数形式正确识别 类是根据词法作用域定义的,而类或 用于进行当前呼叫的实例是基于 传递给该方法的第一个参数。