【发布时间】: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支持。
标签: python