我已经查看了这个链接:http://infohost.nmt.edu/tcc/help/pubs/python/web/new-new-method.html
但是,即使很难,我也按照这些说明操作了一些令我困扰的代码:
error_manager.py:
class error_manager:
def __new__(cls):
cls._error = 0
cls._er_string = "None"
return cls
database.py:
from error_manager import error_manager as EM
class Database(EM):
def __new__(cls, table_name="", database_name=""):
inst = EM.__new__(cls) #THIS LINE
return inst
def __init__(self, table_name="", database_name=""):
print("init dtb")
self.table_name = table_name
self.database_name = database_name
def __str__(self):
return self.table_name + " " + self.database_name
def __repr__(self):
return self.table_name + " " + self.database_name
运行:
dtb = Database("tbl", "dtb")
print(dtb)
输出:
<class '__main__.Database'>
为什么它没有从子类中调用__str_或__repr_方法?
另外在#THIS行上它说&#34;方法调用的位置参数太多参数。但是如果我删除了脚本不会运行的参数。我该怎么办?
答案 0 :(得分:1)
您正在从errormanger.__new__
返回类本身,而不是该类的实例。 __new__
应该看起来像
class error_manager:
def __new__(cls):
inst = object.__new__(cls)
inst._error = 0
inst._er_string = "None"
return inst
但是,覆盖__init__
而不是__new__
会更简单,除非有其他未显示的工作需要覆盖__new__
。
class error_manager:
def __init__(self):
self._error = 0
self._er_string = "None"