我正在尝试创建一个类,该类将返回其自己的子类的实例,但我遇到了麻烦,因为子类的参数数量与类不同:
class Number:
def __new__(cls, number):
if cls is Number and number == 0:
return Zero()
return object.__new__(cls)
def __init__(self, number):
self.number = number
class Zero(Number):
def __new__(cls):
return super().__new__(cls, 0)
def __init__(self):
super().__init__(0)
self.number = 0
Zero() # Ok
Number(0) # TypeError: __init__() takes 1 positional argument but 2 were given
我确切地知道为什么会发生这种情况,并且我可以通过在
Zero
中添加默认参数来轻松修复它:
class Zero(Number):
def __new__(cls, number=0):
return super().__new__(cls, 0)
def __init__(self, number=0):
super().__init__(0)
self.number = 0
但是,我不喜欢它,有没有办法在不添加默认参数的情况下修复它
Zero
?
如果您不喜欢让子类的构造函数接受额外的参数,您可以将基类的构造函数的参数设置为可选:
class Number:
def __new__(cls, number=0):
if cls is Number and number == 0:
return Zero()
return object.__new__(cls)
def __init__(self, number=0):
self.number = number
class Zero(Number):
def __new__(cls):
return super().__new__(cls, 0)