我想有一个类,其方法可以创建超类的新实例(a.k.a。“parent”类)。
另外,我想继承上面描述的类,并让这个子类继承该方法,然后能够使用该方法创建自己的子类的更多实例。
但是,当我尝试这样做时......
class Superclass:
def makeNew(self):
return self.__class__() #this isn't making a clean copy
class Subclass(Superclass):
def __init__(self, value = [1]):
self.value = value
def setValue(self, newValue):
self.value[0] = newValue
if __name__ == "__main__":
s = Subclass()
s.setValue(5)
other = s.makeNew()
print(s.value)
print(other.value)
我得到了
>>> [5] #s.value
>>> [5] #other.value
为什么self.__class__()
没有给我一个超级类的干净副本?
我做错了什么?我怎样才能创建我想要的课程?
答案 0 :(得分:3)
这不是您的makeNew
方法的问题;这是__init__
的问题。当您有一个可变的默认参数时,修改该值将修改您以后的所有默认值。你应该做的是:
def __init__(self, value=None):
if value is None:
value = [1]
# ...
这样,每个新实例都会创建一个新列表,而不仅仅是对同一列表的更多引用。
在旁注中,看起来您不需要value
作为列表。当然,您在此处未显示的其他代码可能需要它,但如果这是所有代码,则您只需要self.value = ...
。由于您现在重新分配self.value
而不是修改它,您可以正确使用默认参数。