以下代码描述了我的意思:
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__()
方法有什么特别之处?似乎它的参数被缓存了。
答案 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__
。