为啥__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__可以直接访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章

GHUnit 错误 _OBJC_CLASS_$_SenTestCase”,引用 [重复]

为啥python中有不相等的运算符[重复]

dyld:找不到符号:尝试在iOS7上运行时_OBJC_CLASS_$_UIUserNotificationSettings [重复]

基本数据类型-集合(set)_上周内容回顾(列表_元组_集合)

错误:无法在字段初始化程序中访问“this”以读取“_endeks”[重复]

组件中缺少历史记录[重复]