Python元类和对象基类

时间:2011-10-31 18:49:09

标签: python metaclass

在阅读了优秀的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。

2 个答案:

答案 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__