我读过为什么 Python 3.x 的 super() 魔术?并了解使用super或__class__在方法中将自动__class__为该方法创建一个单元格变量:
class Demo:
def meth(self):
super().meth()
>>> Demo.meth.__closure__
(<cell at 0x7f4572056138: type object at 0x564bda0e5dd8>,)
>>> Demo.meth.__closure__[0].cell_contents
<class '__main__.Demo'>
据我所知,单元格用于保存闭包变量并且可以自由修改:
def outer():
x = 3
def inner():
print(x)
x = 5
return inner
inner = outer()
inner() # output: 5
>>> inner.__closure__
(<cell at 0x7f2183a5e138: int object at 0x7f2184600460>,)
但是尝试重新分配__class__单元格的值会super引发一个奇怪的错误:
class Demo:
def meth(self):
__class__ = Demo
super().meth()
Demo().meth()
Traceback (most recent call last):
File "untitled.py", line 8, in <module>
Demo().meth()
File "untitled.py", line 6, in meth
super().meth()
RuntimeError: super(): __class__ cell not found
为什么会发生这种情况?为什么不能__class__像其他闭包变量一样重新赋值?
相关分类