私の理解では、関数とクラスのスコープはほとんど同じように動作します。
>>> def x():
... a = 123
... print (locals())
...
>>> x()
{'a': 123}
>>> class x():
... a = 123
... print (locals())
...
{'a': 123, '__module__': '__main__'}
ただし、クロージャーを定義すると、動作が異なります。関数は、予想どおり、単純にローカル バインディングを返します。
>>> def x():
... a = 123
... t = lambda: a
... return t
...
>>> x()()
123
一方、クラスではバインディングが失われているように見えます:
>>> class x():
... a = 123
... t = lambda self: a
...
>>> x().t()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in <lambda>
NameError: global name 'a' is not defined
誰も矛盾を説明できますか?