Python 中的元类编程 - 理解继承的奥秘和实例创建
2007-03-29 12:10:53 来源:WEB开发网核心提示: >>> earl.__class__.attributes图1对比了只涉及继承或是元类的简单情况,而不是同时涉及的情况,Python 中的元类编程 - 理解继承的奥秘和实例创建(5),但有些时候,一个类 C 同时有定制元类M和基类 B:清单 6. 结合元类与超类>&
>>> earl.__class__.attributes
图1对比了只涉及继承或是元类的简单情况,而不是同时涉及的情况。但有些时候,一个类 C 同时有定制元类M和基类 B:
清单 6. 结合元类与超类
>>> class M(type):
... a = 'M.a'
... x = 'M.x'
...
>>> class B(object): a = 'B.a'
...
>>> class C(B): __metaclass__=M
...
>>> c=C()
图形化表示为:
图 2. 超类与元类的结合
根据前面的解释,我们能够想像 C.a 将解析成 M.a 或 B.a 。当解析发生时,在查找实例化元类之前,会先遵循它的 MRO 对类进行查找。
清单 7. 解析元类与超类
>>> C.a, C.x
('B.a', 'M.x')
>>> c.a
'B.a'
>>> c.x
[...]
AttributeError: 'C' object has no attribute 'x'
您仍然可以使用元类来增强属性,只需在被实例化的类对象上进行设置,而不是像元类的属性那样。
清单 8. 在元类中设置属性
>>> class M(type):
... def __init__(cls, *args):
... cls.a = 'M.a'
...
>>> class C(B): __metaclass__=M
...
>>> C.a, C().a
('M.a', 'M.a')
类的更多魔力
对于实现像 .__new__() , .__init__() , .__str__() 等这样的特殊方法来说,实例化的约束要比继承的约束更弱这一事实很重要。我们将要讨论 .__str__() 方法,对于其他特殊方法的分析与此类似。
更多精彩
赞助商链接