如何克隆 class 但不复制可变属性?

How to clone a class but not copy mutable attributes?

我正在尝试编写 python 代码来跟踪 class 的已创建实例,并通过会话保存它。我试图通过在 class 减速内创建一个列表来实现这一点,该列表跟踪实例。我的代码如下:

class test_object:
    _tracking = []

    def __init__(self, text):
        self.name = text
        test_object._tracking.insert(0, self)

with open("tst.pkl", mode="rb") as f:
    try:
        pickles = dill.load(f)
    except:
        pickles = test_object
        logger.warning("Found dill to be empty")
f.close()

我的问题是在 pickled 数据为空时处理。在这种情况下,我想做的是简单地使用基数 class。我 运行 遇到的问题是 test_object._tracking 最终等于 pickles._tracking。有没有办法制作 test_object 的副本,以便当 test_object._tracking 获得更新时,pickles._tracking 保持不变?

您可以执行以下操作:

import dill 

class test_object:
    _tracking = []

    def __init__(self, text):
        self.name = text
        test_object._tracking.insert(0, self)

test_1 = test_object("abc")
print(test_object._tracking)
# result: [<__main__.test_object object at 0x11a8cda50>]

with open("./my_file.txt", mode="rb") as f:
    try:
        pickles = dill.load(f)
    except:
        pickles = type('test_object_copy', test_object.__bases__, dict(test_object.__dict__))
        pickles._tracking = []

        print("Found dill to be empty")
# The above results in "Found dill to be empty"

print(pickles._tracking)
# prints []

它会将泡菜设置为原始 class 的副本。它的跟踪属性将是空的,并且与原始 'tracking' 不同。