为啥__class__可以直接访问[重复]

Posted

技术标签:

【中文标题】为啥__class__可以直接访问[重复]【英文标题】:Why __class__ can be directly accessed [duplicate]为什么__class__可以直接访问[重复] 【发布时间】:2020-04-19 00:02:15 【问题描述】:

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

谁能解释一下为什么会这样?

【问题讨论】:

@DYZ:不。一方面,类主体中定义的方法和变量不能通过方法主体中的裸名访问。另一方面,__class__ 实际上并未在类主体中定义。 (Test.__class__ 是一个有效的表达式,但指的是完全不同的东西。self.__class__ 也是一个有效的表达式,但指的是一个导致许多错误的微妙不同的东西。)这个__class__ 是一个奇怪的特殊情况用于super 支持。 文档:docs.python.org/3/reference/… 相关:***.com/questions/36993577/… 【参考方案1】:

所以,编译器找到父类是一个怪癖。

来自Python Data Model:

__class__ 是由编译器创建的隐式闭包引用,如果类主体中的任何方法引用 __class__ 或 super。这 允许 super() 的零参数形式正确识别 类是基于词法作用域定义的,而类或 用于进行当前调用的实例是基于 传递给方法的第一个参数。

【讨论】:

以上是关于为啥__class__可以直接访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章