在阅读了优秀的SO post之后,我尝试了制作模块级别的元类:
def metaclass(future_class_name, future_class_parents, future_class_attrs):
print "module.__metaclass__"
future_class_attrs["bar"]="bar"
return type(future_class_name, future_class_parents, future_class_attrs)
__metaclass__=metaclass
class Foo(object):
def __init__(self):
print 'Foo.__init__'
f=Foo()
除非我删除Foo的object
基类,否则这不起作用(即“module。元类”不会被打印)。怎么样?
注意:我使用的是Python 2.6.1。
答案 0 :(得分:3)
继承 object 会自动带来类型元类。这将覆盖您的模块级 __ metaclass __ 规范。
如果在类级别指定元类,则 object 不会覆盖它:
def metaclass(future_class_name, future_class_parents, future_class_attrs):
print "module.__metaclass__"
future_class_attrs["bar"]="bar"
return type(future_class_name, future_class_parents, future_class_attrs)
class Foo(object):
__metaclass__ = metaclass
def __init__(self):
print 'Foo.__init__'
f=Foo()
请参阅http://docs.python.org/reference/datamodel.html?highlight=metaclass#customizing-class-creation
答案 1 :(得分:2)
规范specifies the order in which Python will look for a metaclass:
适当的元类由以下优先级确定 规则:
- 如果
dict['__metaclass__']
存在,则使用它。- 否则,如果有 至少有一个基类,它的元类被使用(这看起来是一个 首先
__class__
属性,如果没有找到,则使用其类型)。- 否则,如果存在名为
__metaclass__
的全局变量,则使用它。- 否则,使用旧式的经典元类(
types.ClassType
)。
您将从上面看到,在所有中都有一个基类(无论基类是什么,即使它最终不是从object
继承),也会抢占模块 - 等级__metaclass__
。