Python 中的元类编程 - 理解继承的奥秘和实例创建
2007-03-29 12:10:53 来源:WEB开发网核心提示: 清单 4. 实例中的属性>>> charles=Prince()>>> charles.attributes# ...remember, not the real world('Power', 'Wealth', '
清单 4. 实例中的属性
>>> charles=Prince()
>>> charles.attributes # ...remember, not the real world
('Power', 'Wealth', 'Beauty')
如果 Duke 碰巧有一个定制元类,那么它能够以以下方式获得一些属性:
>>> class Nobility(type): attributes = Power, Wealth, Beauty
...
>>> class Duke(object): __metaclass__ = Nobility
...
Duke是一个类,也是元类 Nobility 的一个实例——属性的查找过程与其他对象一致:
>>> Duke.attributes
('Power', 'Wealth', 'Beauty')
但是 Nobility 不是 Duke 的超类,所以这就是为什么 Duke 的 实例会找到 Nobility.attributes 的原因:
清单 5. 属性与元类
>>> Duke.mro()
[<class '__main__.Duke'>, <type 'object'>]
>>> earl = Duke()
>>> earl.attributes
[...]
AttributeError: 'Duke' object has no attribute 'attributes'
元类属性的可用性是不会传递的,也就是说,元类的属性是对它的实例是可用的,但是对它的实例的实例是不可用的。这正是元类与超类的主要不同。下图强调了继承与实例化的异同。
图 1. 实例化与继承
因为 earl 仍然有一个类,因而您可以间接地得到其属性:
更多精彩
赞助商链接