寶慕林4294392
2019-02-24 04:10:08
最近在學(xué)習(xí)元類。
#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,中運(yùn)行時(shí)提示:
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)卻可以正常輸出。還請(qǐng)各位指教?
3 回答

慕尼黑5688855
TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
metaclass必須要從type繼承。上面的Model在Python2.7下有語(yǔ)法錯(cuò)誤,在Python3中可以產(chǎn)生Model Class但無(wú)法進(jìn)行實(shí)例話。在Python3中可以順利產(chǎn)生Model Class的原因我猜想可能是 “object是type的基類”的原因。

慕桂英546537
TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
改成這樣,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

30秒到達(dá)戰(zhàn)場(chǎng)
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是我修改過(guò)的代碼:
python2下通過(guò)
# 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
關(guān)于python的元類解釋,推薦你看一篇文章,講解非常清楚,
傳送門(mén): 深刻理解Python中的元類(metaclass)
添加回答
舉報(bào)
0/150
提交
取消