Python元类和对象基类
在阅读了《优秀》之后,我尝试创建一个模块级元类:Python元类和对象基类,python,metaclass,Python,Metaclass,在阅读了《优秀》之后,我尝试创建一个模块级元类: 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) __
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的对象
基类,否则这不起作用(即“module.元类”不会被打印)。为什么
注意:我使用的是Python 2.6.1。从对象继承会自动带来类型元类。这将覆盖您的模块级元类规范
如果元类是在类级别指定的,则对象不会覆盖它:
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()
请参见本规范:
适当的元类由以下优先级决定
规则:
- 如果存在
,则使用它李>dict[''元类]
- 否则,如果有
至少有一个基类,使用它的元类(这查找
属性,如果未找到,则使用其类型)\uuuuu class\uuuuu
- 否则,如果名为
的全局变量存在,则使用它\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
- 否则,将使用老式的经典元类(
)types.ClassType
您将从上面看到,拥有一个基类(不管基类是什么,即使它最终不是从
对象继承的)会优先于模块级\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu元类规范没有这样的规定。它所说的是,如果存在基类,则将使用基类的元类,而不管基类是否指定了元类。