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



             

Листинг 5. Атрибуты и метаклассы


>>> 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:






Содержание  Назад  Вперед