我有两节课。它们几乎完全相同,除了2个属性。我需要将所有属性从一个复制到另一个,我只是想知道是否有模式或最佳实践,或如果我应该基本上做:
spam.attribute_one = foo.attribute_one
spam.attribute_two = foo.attribute_two
......等等。
答案 0 :(得分:15)
您提供的代码是正确和安全的,避免了“意外”绑定应该不绑定的属性。但是,如果您喜欢自动化而不是安全性和正确性,那么可以使用像......这样的东西:
def blindcopy(objfrom, objto):
for n, v in inspect.getmembers(objfrom):
setattr(objto, n, v);
但是,我不推荐它(由于第一段所暗示的原因;-)。 OTOH,如果您知道要复制的属性的名称,以下就可以了:
def copysome(objfrom, objto, names):
for n in names:
if hasattr(objfrom, n):
v = getattr(objfrom, n)
setattr(objto, n, v);
如果您经常这样做,在“实用程序”模块中使用此代码一次可能是您的明确胜利!
答案 1 :(得分:3)
如果它们相似,并且需要更改状态,则听起来您确实拥有一个类的实例,以及确定其行为的mode
或类似属性。物体不应该从一个物体变形到另一个物体,相似但是分开的物体,通常都是。
答案 2 :(得分: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()
)
)
这可以节省很多循环迭代时间。