具有默认参数的python类__init __()方法的神秘行为

时间:2017-03-13 20:45:09

标签: python class

以下代码描述了我的意思:

class Demo(object):

    def __init__(self, data=[]):
        self.data = data

    def add(self, item):
        self.data.append(item)

    def get_data(self):
        return self.data

    def clear(self):
        self.__init__()

demo = Demo()

demo.add(1)
demo.add(2)
demo.clear()

print(demo.get_data())

我希望它打印出[]。令人惊讶的是,它没有。

我必须重写该类来修复它:

class Demo2(object):

    def __init__(self, data=[]):
        self.init(data)

    def init(self, data=[]):
        self.data = data

    def add(self, item):
        self.data.append(item)

    def get_data(self):
        return self.data

    def clear(self):
        self.init()

    demo = Demo2()

    demo.add(1)
    demo.add(2)
    demo.clear()

    print(demo.get_data())

这次正确打印出[]

python类的__init__()方法有什么特别之处?似乎它的参数被缓存了。

1 个答案:

答案 0 :(得分:1)

默认参数[]仅在定义类时评估一次。您需要执行以下操作:

def __init__(self, data=None):
    if data is None:
        data=[]
    self.init(data)

def __init__(self, data=[]):
    self.data = data[:]

此外,这纯粹是一种风格,但我建议将此逻辑移动到另一个名为reinitialize的函数中,而不是让clear调用__init__