类未创建新的实例变量

时间:2018-07-21 22:28:38

标签: python python-3.x initialization static-methods

我有以下Python(3.6.0)类:

class SampleClass(object):
    @staticmethod
    def create(*data):
        sample_instance = SampleClass()
        sample_instance.add_data(*data)
        return sample_instance

    def __init__(self, data_map={}):
        super(SampleClass, self).__init__()
        self.data_map = data_map

    def add_data(self, *data):
        for key, value in data:
            self.data_map.setdefault(key, []).append(value)

静态方法create是初始化新实例的便捷方法。但是,当多次调用create时,不会重新创建data_map属性。例如:

sample_instance1 = SampleClass.create(('a', 1), ('b', 2), ('c', 3))
sample_instance2 = SampleClass.create()
sample_instance1.data_map == sample_instance2.data_map  # True
sample_instance1.data_map is sample_instance2.data_map  # True

如果我将__init__方法更改为此,问题就消失了:

    def __init__(self):
        super(SampleClass, self).__init__()
        self.data_map = {}

有人可以帮助我了解这里发生的事情吗?

1 个答案:

答案 0 :(得分:1)

默认参数data_map={}仅在定义函数时创建一次。如果您进行了更改,则更改将在以后的调用中保留。这意味着SampleClass的每个未获得新字典的实例都有一个self.data_map指向同一(默认)字典实例。