最近在学习元类。
#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 回答
![?](http://img1.sycdn.imooc.com/5333a2320001acdd02000200-100-100.jpg)
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
metaclass必须要从type继承。上面的Model在Python2.7下有语法错误,在Python3中可以产生Model Class但无法进行实例话。在Python3中可以顺利产生Model Class的原因我猜想可能是 “object是type的基类”的原因。
![?](http://img1.sycdn.imooc.com/5458502c00012d4a02200220-100-100.jpg)
慕桂英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
![?](http://img1.sycdn.imooc.com/54584cd10001404b02200220-100-100.jpg)
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)
添加回答
举报
0/150
提交
取消