为什么分配给 __class__ 单元格会破坏 `super`?

我读过为什么 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__像其他闭包变量一样重新赋值?


胡子哥哥
浏览 169回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python