为啥__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”,引用 [重复]
dyld:找不到符号:尝试在iOS7上运行时_OBJC_CLASS_$_UIUserNotificationSettings [重复]
基本数据类型-集合(set)_上周内容回顾(列表_元组_集合)