Python - 将对象的属性复制到另一个属性的正确方法是什么?

时间:2010-09-29 04:53:56

标签: python design-patterns

我有两节课。它们几乎完全相同,除了2个属性。我需要将所有属性从一个复制到另一个,我只是想知道是否有模式或最佳实践,如果我应该基本上做:

spam.attribute_one = foo.attribute_one
spam.attribute_two = foo.attribute_two

......等等。

3 个答案:

答案 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()
        )
)

这可以节省很多循环迭代时间。