__name__ поле класса, истолкованное с использованием функции type () - PullRequest
1 голос
/ 01 мая 2020

Почему поле __name__ имеет два значения, как в следующем коде?

cls = type('A',(object,),{'__name__':'not_A'})

cls.__dict__['__name__']

это дает 'not_A'

cls.__name__

это дает

'A'

почему они разные?

1 Ответ

0 голосов
/ 02 мая 2020

Класс type, из которых cls является экземпляром, имеет атрибут __name__, который является своего рода дескриптором:

>>> type.__dict__['__name__']
<attribute '__name__' of 'type' objects>
>>> type(_)
<class 'getset_descriptor'>

При попытке доступа к фактическому атрибуту экземпляра в cls с тем же именем, getset_descriptor имеет приоритет, так что единственный способ получить доступ к атрибуту Instant - напрямую через cls.__dict__.

...