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元类

规范没有这样的规定。它所说的是,如果存在基类,则将使用基类的元类,而不管基类是否指定了元类。