为了账号安全,请及时绑定邮箱和手机立即绑定

关于python的元类的问题

关于python的元类的问题

宝慕林4294392 2019-02-24 04:10:08
最近在学习元类。 #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 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-04
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

改成这样,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
查看完整回答
反对 回复 2019-03-04
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这是我修改过的代码:
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)

查看完整回答
反对 回复 2019-03-04
  • 3 回答
  • 0 关注
  • 624 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信