2015-09-22 4 views

ответ

39

Это помогает переводчику заверить, что ключи для атрибутов и методов уровня класса может быть только строки.

В другом месте, Python является «соглашающимся взрослым языком», что означает, что пользовательские объекты для объектов подвергаются и изменяются пользователем. Однако в случае атрибутов класса и методов для классов, если мы можем гарантировать, что ключи являются строками, мы можем упростить и ускорить общий код случая для поиска атрибутов и методов на уровне класса. В частности, логика поиска __mro__ для классов нового стиля упрощается и ускоряется, предполагая, что ключи класса dict являются строками.

+11

И для любопытных: 'mappingproxy' делает' class .__ dict__' только для чтения, так что только 'class .__ setattr__' остается в качестве проспекта для установки атрибутов класса, и именно этот метод [принудительно ограничивает] (https://hg.python.org/cpython/file/ed694938c61a/Objects/object.c#l1132). –

+2

Это также актуально для тех, кто переопределяет 'type .__ setattr__' (который, мы надеемся, вероятно, довольно маленький набор), поскольку вы не можете писать в' __dict__'; вы должны использовать 'super()'. – Kevin

+2

Он также гарантирует, что если вы дадите классу новый магический метод, Python сможет обновить соответствующий слот уровня C. Если вы обходите это, используя что-то вроде 'gc.get_referents (FooClass .__ dict __) [0] ['__ eq__'] = eqmethod', экземпляры' FooClass' могут фактически не использовать 'eqmethod' для' == 'сравнений. – user2357112