Python - 如何正确复制一个对象的属性到另一个对象?
我有两个类,它们几乎一模一样,只有两个属性不同。我需要把一个类里的所有属性都复制到另一个类里。我在想,有没有什么规律或者最佳做法,还是说我就直接这样做:
spam.attribute_one = foo.attribute_one
spam.attribute_two = foo.attribute_two
... 以此类推。
3 个回答
0
我用字典推导式来遍历字典里的每一项,然后对另一个对象调用了 setattr()
方法。
{k: setattr(object_to, k, v) for k, v in object_from.dict().items()}
因为我不需要新的 dict
,所以没有把返回的结果赋值给任何变量。
我还尝试了另一种方法,就是使用 map() 函数。
dict(
map(lambda item: (item[0], setattr(object_to, item[0], item[1])
),
object_from.dict().items()
)
)
这样可能会节省很多循环的时间。
3
如果它们这么相似,而且需要改变状态,那听起来你其实是在用同一个类的不同实例,只是有一个mode
或者类似的属性来决定它们的行为。对象不应该经常从一个对象变成另一个对象,虽然它们看起来相似,但实际上是两个不同的对象。
20
你给的代码是正确的,而且很安全,避免了“意外”绑定那些不应该绑定的属性。不过,如果你更喜欢自动化而不是安全和正确性的话,你可以使用类似下面的代码:
def blindcopy(objfrom, objto):
for n, v in inspect.getmembers(objfrom):
setattr(objto, n, v);
不过,我不太推荐这样做(因为第一段提到的原因;-)。另一方面,如果你知道想要复制的属性名称,下面的代码就很好:
def copysome(objfrom, objto, names):
for n in names:
if hasattr(objfrom, n):
v = getattr(objfrom, n)
setattr(objto, n, v);
如果你经常做这种事情,把这段代码放在一个“工具”模块里,绝对会对你有帮助!