Атрибуты и метаклассы
>
>
>
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: