关于python的元类的问题

最近在学习元类。

#python3
# coding=utf-8
class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        print("ainia")
        return type.__new__(cls, name, bases, attrs)
class BBB:
    def __new__(cls, name, bases, attrs):
        print("BBBBB")
        return object.__new__(cls, name, bases, attrs)
class Model(metaclass=BBB):
    pass
class Model2(metaclass=ModelMetaclass):
    pass
#python2
# coding=utf-8
class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        print("ainia")
        return type.__new__(cls, name, bases, attrs)
class BBB(object):
    def __new__(cls, name, bases, attrs):
        print("BBBBB")
        return object.__new__(cls, name, bases, attrs)
class Model(object):
    __metaclass__ = BBB
    pass
class Model2(object):
    __metaclass__ = ModelMetaclass
    pass

以上代码另存为test.py,中运行时提示:

Traceback (most recent call last):
  File "test2.py", line 18, in <module>
    class Model(metaclass=BBB):
  File "test2.py", line 15, in __new__
    return object.__new__(cls, name, bases, attrs)
TypeError: object() takes no parameters

但是如果我把return object.__new__(cls, name, bases, attrs)修改为return object.__new__(cls)却可以正常输出。
还请各位指教?

阅读 3.1k
3 个回答

metaclass必须要从type继承。上面的Model在Python2.7下有语法错误,在Python3中可以产生Model Class但无法进行实例话。在Python3中可以顺利产生Model Class的原因我猜想可能是 “object是type的基类”的原因。

改成这样,new方法里object改成type.

class BBB(type):

    def __new__(cls, name, bases, attrs):
        print("BBBBB")
        return type.__new__(cls, name, bases, attrs)


class Model():
    __metaclass__ = BBB
新手上路,请多包涵

这是我修改过的代码:
python2下通过

# coding=utf-8
class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        print("ainia")
        return type.__new__(cls, name, bases, attrs)
class BBB(type):
    def __new__(cls, name, bases, attrs):
        print("BBBBB")
        return type.__new__(cls, name, bases, attrs)
class Model:
    __metaclass__ = BBB
class Model2:
    __metaclass__ = ModelMetaclass

关于python的元类解释,推荐你看一篇文章,讲解非常清楚,
传送门: 深刻理解Python中的元类(metaclass)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题