【问题标题】:Class not creating new instance variables [duplicate]类不创建新的实例变量[重复]
【发布时间】:2018-07-21 22:28:38
【问题描述】:

我有以下 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 = {}

有人可以帮我理解这里发生了什么吗?

【问题讨论】:

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


    【解决方案1】:

    默认参数data_map={}仅在定义函数时创建一次。如果您对其进行变异,则更改将在未来的调用中持续存在。这意味着没有给定新字典的SampleClass 的每个实例都有一个指向相同(默认)字典实例的self.data_map

    【讨论】:

    • 太棒了,谢谢;在仍然接受 kwarg 的同时,每次重新创建的最佳方法是什么?像__init__(self, data_map=None) 然后self.data_map = data_map or {}
    • @treyhakanson 是的,这是一个好方法。此问题已被标记为重复,请参阅链接问题中的答案以了解其他方法。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2020-07-16
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多