Jun 12, 2012

Metaclass in Python, 元类

参考
What is a metaclass in Python?
翻译:深刻理解Python中的元类(metaclass)

Python 所有东西都是对象(例外是 type,而type就是本文的主题),包括函数和类。
那么类是什么东西的对象呢?答案是元类 Metaclass
元类是类的类,也就是控制类创建的东西。

type 是python默认的原来,所以如果创建一个类时
class foo(bar):
    pass

如果没有指定 __metaclass__,父类追溯没有__metaclass__,模块中没有 __metaclass__,则系统用默认的元类 type 来创建。

什么时候要用到元类?想改变类创建方式的时候,目的是使得得到的类和声明的不同。举个最简单的例子,把类的所有属性都变成大写。

则声明
class foo(bar):
    abc = 1
如果使用了上述特殊目的的元类,则 foo 没有属性 abc,而只有属性 ABC.

django 中大量使用了元类,model 类使用了元类,让其fields在建立时就和数据库挂钩。

最后
“元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。”  —— Python界的领袖 Tim Peters

0 comments: