如何从该类的实例创建类的实例?

时间:2017-01-18 03:11:18

标签: python class inheritance

我想有一个类,其方法可以创建超类的新实例(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__()没有给我一个超级类的干净副本?

我做错了什么?我怎样才能创建我想要的课程?

1 个答案:

答案 0 :(得分:3)

这不是您的makeNew方法的问题;这是__init__的问题。当您有一个可变的默认参数时,修改该值将修改您以后的所有默认值。你应该做的是:

def __init__(self, value=None):
    if value is None:
        value = [1]
    # ...

这样,每个新实例都会创建一个新列表,而不仅仅是对同一列表的更多引用。

在旁注中,看起来您不需要value作为列表。当然,您在此处未显示的其他代码可能需要它,但如果这是所有代码,则您只需要self.value = ...。由于您现在重新分配self.value而不是修改它,您可以正确使用默认参数。