如何克隆 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' 不同。
我正在尝试编写 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' 不同。