Я прочитал Почему в 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__
переназначить как другие переменные замыкания?