Питон - статьи
773123a3

Атрибуты и метаклассы


>
>
>
Duke.mro() [<class '__main__.Duke'>
, <type 'object'>
] >
>
>
earl = Duke() >
>
>
earl.attributes [...] AttributeError: 'Duke' object has no attribute 'attributes'

Доступность атрибутов метакласса не является транзитивной, другими словами, атрибуты метакласса доступны его экземплярам, но не экземплярам экземпляров. Именно это и есть главное различие между метаклассами и базовыми классами. Следующая диаграмма подчеркивает ортогональность наследования и воплощения:





Рис. 1. Воплощение и наследование



Поскольку у earl по-прежнему есть класс, вы можете, однако, не напрямую отыскать этот атрибут:

>
>
>
earl.__class__.attributes

На рисунке 1 противопоставляются простые случаи, когда используется либо наследование, либо задействованы метаклассы, но не обе концепции одновременно. Иногда, однако, у класса C есть и класс M, определенный пользователем, и базовый класс B:





Содержание раздела