我正在创建一个数据提供者类,它将保存数据、执行转换并使其可用于其他类。
如果用户创建这个类的实例并在实例化时传递一些数据,我想将它存储两次:一次用于所有转换,一次作为原始数据的副本。让我们假设数据本身有一个copy
方法。
我正在使用attrs
包来创建类,但通常也会对最好的方法感兴趣(也许有更好的方法来获得我想要的东西?)
这是我到目前为止所拥有的:
@attr.s
class DataContainer(object):
"""Interface for managing data. Reads and write data, acts as a provider to other classes.
"""
data = attr.ib(default=attr.Factory(list))
data_copy = data.copy()
def my_func(self, param1='all'):
"""Do something useful"""
return param1
这不起作用:AttributeError: '_CountingAttr' object has no attribute 'copy'
我也不能打电话data_copy = self.data.copy()
,我得到错误:NameError: name 'self' is not defined
。
没有包的工作等效项attrs
是:
class DataContainer(object):
"""Interface for managing data. Reads and write data, acts as a provider to other classes.
"""
def __init__(self, data):
"Init method, saving passed data and a backup copy"
self.data = data
self.data_copy = data
编辑:
正如@hynek 所指出的,我上面的简单 init 方法需要更正以制作数据的实际副本:即self.data_copy = data.copy()
. 否则两者self.data
都会self.data_copy
指向同一个对象。