Здесь сюрприз:
>>> class B:
... print(locals())
... def foo(self):
... print(locals())
... print(__class__ in locals().values())
...
{'__module__': '__main__', '__qualname__': 'B'}
>>> B().foo()
{'__class__': <class '__main__.B'>, 'self': <__main__.B object at 0x7fffe916b4a8>}
True
Кажется, что простое упоминание __class__ явно проверяется парсером? В противном случае мы должны получить что-то вроде
NameError: name '__class__' is not defined
В самом деле, если вы модифицируете, чтобы проверить только ключ, т.е. проверить на '__class__' in locals(), тогда у нас есть только self в области видимости.
Как происходит, что эта переменная волшебным образом вводится в область видимости? Я предполагаю, что это как-то связано с super - но я не использовал super, поэтому почему компилятор создает ссылку на неявное замыкание здесь, если это не нужно?