__new__个元类抛出错误

  • 本文关键字:出错 错误 new python
  • 更新时间 :
  • 英文 :


我正在测试元类的使用,并坚持创建对象。新方法抛出错误";缺少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

相关内容

最新更新