Python 中的元类编程 - 理解继承的奥秘和实例创建
2007-03-29 12:10:53 来源:WEB开发网核心提示: >>> d.__dict__, d.a5, d.a1({'a5': 'instance d'}, 'instance d', 'A')查找一个不与实例关联的属性时有一个技巧,即先在实例的类中查找,Python
>>> d.__dict__, d.a5, d.a1
({'a5': 'instance d'}, 'instance d', 'A')
查找一个不与实例关联的属性时有一个技巧,即先在实例的类中查找,然后再在从所有的超类中查找。这一过程中父类被检查的顺序被称为这个类的 方法解析顺序,您可以利用以下这个(元)方法 .mro() 看出该顺序 (但只能是从类对象中看到):
>>> [k.__name__ for k in d.__class__.mro()]
['D', 'C', 'A', 'B', 'object']
换句话说,访问 d.attr 时首先是在 d.__dict__ 中,然后在 D.__dict__ , C.__dict__ , A.__dict__ , B.__dict__ ,最后才是在 object.__dict__ 中查找,如果在任意一个地方都未找到这个名字,就会产生一个 AttributeError 。
注意,从未在查找过程中提到过元类。
元类与祖先
这里有一个普通的继承的简单例子,我们定义了一个 Noble 基类,它有子类 Prince , Duke , Baron 等等。
清单 3. 属性继承
>>> for s in "Power Wealth Beauty".split(): exec '%s="%s"'%(s,s)
...
>>> class Noble(object): # ...in fairy tale world
... attributes = Power, Wealth, Beauty
...
>>> class Prince(Noble):
... pass
...
>>> Prince.attributes
('Power', 'Wealth', 'Beauty')
类 Prince 继承了 Noble 的属性, Prince 类的实例仍然遵循上述的查找链。
更多精彩
赞助商链接