Как работает система создания специальных атрибутов класса? - PullRequest
1 голос
/ 30 января 2020

Мои вопросы:

  • Что это за особые предметы, найденные в объекте, похожем на диктовку, которые были возвращены методом __prepare__?

    >>> class A(object):
    ...     print(locals())
    ... 
    {'__module__': '__main__', '__qualname__': 'A'}
    >>> class A(object):
    ...     """123"""
    ...     print(locals())
    ... 
    {'__module__': '__main__', '__qualname__': 'A', '__doc__': '123'}
    

    Есть ли какие-либо другие «специальные» элементы, помещенные в оператор класса locals(), кроме __module__, __qualname__ и __doc__? Можно ли предотвратить / изменить такое поведение с помощью оператора класса ? Имеет ли смысл менять их внутри оператора класса или нет? Можно ли изменить другие атрибуты класса (например, __name__) внутри оператора класса? Как выглядит аргумент-функция exec_body из types.new_class, чтобы полностью эмулировать создание операторов класса?

  • что это за специальные элементы, найденные в cls.__dict__ после cls создания?

    >>> class A(object): pass
    >>> class B(A): pass
    >>> class C(object): __slots__ = ()
    >>> print(A.__dict__, B.__dict__, C.__dict__, sep='\n')
    {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
    {'__module__': '__main__', '__doc__': None}
    {'__module__': '__main__', '__slots__': (), '__doc__': None}
    

    Есть ли какие-либо другие «специальные» предметы, помещенные в cls.__dict__, кроме __module__, __dict__, __weakref__, __doc__, __slots__? В каких случаях они появляются?

  • как создаются специальные элементы оператора класса locals(), специальные элементы в cls.__dict__ и другие специальные атрибуты класса (например, __class__, __bases__, __base__, __mro__, __name__, __qualname__) взаимодействуют друг с другом? Есть ли такие взаимодействия?

...