Python - 如何正确复制一个对象的属性到另一个对象?

15 投票
3 回答
11344 浏览
提问于 2025-04-16 04:44

我有两个类,它们几乎一模一样,只有两个属性不同。我需要把一个类里的所有属性都复制到另一个类里。我在想,有没有什么规律或者最佳做法,还是说我就直接这样做:

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);

如果你经常做这种事情,把这段代码放在一个“工具”模块里,绝对会对你有帮助!

撰写回答