我正在测试元类的使用,并坚持创建对象。新方法抛出错误";缺少3个必需的位置参数":
bash-4.4$ python3 sftester.py
Traceback (most recent call last):
File "sftester.py", line 2, in <module>
from sorrogatefactory import make_SA_Sorrogate
File "/home/alelai/anvil9/kafka-client-new/sorrogatefactory.py", line 42, in <module>
class make_SA_Sorrogate(SA_AddOn, metaclass=SorrogateFactory()):
TypeError: __new__() missing 3 required positional arguments: 'classname', 'supers', and 'classdict'
bash-4.4$ cat sftester.py
from sorrogatefactory2 import SorrogateFactory, make_SA_Sorrogate
if __name__ == '__main__':
sa_sorrogate = make_SA_Sorrogate()
bash-4.4$ cat sorrogatefactory2.py
class SorrogateFactory(object):
def __call__(self, classname, supers, classdict):
print("In __call__")
print("Making " + classname + " of" + " classname")
Class = self.__new__(classname, supers, classdict)
self.__init__(Class, classname, supers, classdict)
return Class
def __new__(self, classname, supers, classdict):
print("In __new__")
return type(classname, supers, classdict)
def __init__(self):
print("In __init__")
pass
class SA_AddOn(object):
pass
class make_SA_Sorrogate(SA_AddOn, metaclass=SorrogateFactory()):
def dumb(slef):
pass
错误消息中提到的_new_((方法似乎不是SorrogateFactory的_new_((。这里有什么问题?
您必须使元类从type
而不是object
继承。
class SorrogateFactory(type):
def __call__(self, classname, supers, classdict):
print("In __call__")
print("Making " + classname + " of" + " classname")
Class = self.__new__(classname, supers, classdict)
self.__init__(Class, classname, supers, classdict)
return Class
def __new__(self, classname, supers, classdict):
print("In __new__")
return type(classname, supers, classdict)
def __init__(self):
print("In __init__")
pass
class SA_AddOn(object):
pass
此外,只需使用不带括号的元类,否则您将对其进行实例化。这就是为什么您会收到关于3个参数的错误消息。
class make_SA_Sorrogate(SA_AddOn, metaclass=SorrogateFactory):
def dumb(slef):
pass