Python 中的元类编程
2008-09-30 12:43:17 来源:WEB开发网富有“魔力”的 .__new__() 和 .__init__() 方法很特殊,但在概念上,对于任何其它类,它们的工作方式都是一样的。 .__init__() 方法使您能配置所创建的对象; .__new__() 方法使您能定制它的分配。当然,后者没有被广泛地使用,但对于每个 Python 2.2 new 样式的类(通常通过继承而不是覆盖),都存在该方法。
需要注意 type 后代的一个特性;它常使第一次使用元类的人们“上圈套”。按照惯例,这些方法的第一个参数名为 cls ,而不是 self ,因为这些方法是在 已生成的类上进行操作的,而不是在元类上。事实上,关于这点没什么特别的;所有方法附加在它们的实例上,而且元类的实例是类。非特殊的名称使这更明显:
清单 5. 将类方法附加在所生成的类上
>>> class Printable(type):
... def whoami(cls): print "I am a", cls.__name__
...
>>> Foo = Printable('Foo',(),{})
>>> Foo.whoami()
I am a Foo
>>> Printable.whoami()
Traceback (most recent call last):
TypeError: unbound method whoami() [...]
所有这些令人惊讶但又常见的做法以及便于掌握的语法使得元类的使用更容易,但也让新用户感到迷惑。对于其它语法有几个元素。但这些新变体的解析顺序需要点技巧。类可以从其祖先那继承元类 — 请注意,这与将元类 作为祖先 不一样(这是另一处常让人迷惑的地方)。对于老式类,定义一个全局 _metaclass_ 变量可以强制使用定制元类。但大多数时间,最安全的方法是,在希望通过定制元类来创建类时,设置该类的 _metaclass_ 类属性。必须在类定义本身中设置变量,因为 如果稍后(在已经创建类对象之后)设置属性,则不会使用元类。例如:
更多精彩
赞助商链接