WEB开发网
开发学院软件开发Python Python 中的元类编程 - 理解继承的奥秘和实例创建... 阅读

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__() 方法,对于其他特殊方法的分析与此类似。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Python 编程 理解

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接