有没有一种在python中创建副本构造函数的好方法?

有没有一种在python中创建副本构造函数的好方法?,python,copy-constructor,deep-copy,Python,Copy Constructor,Deep Copy,我意识到有人问过类似的问题,尽管不是这样 我想为我的类的构造函数提供一个可选参数,如果它是我的类的实例,那么它将被复制。例如,类似(我知道此代码不起作用!): 我知道有一些切实可行的解决办法。我可以根据foo对应属性的值设置self的每个属性,但这真的很烦人,因为我的类有很多很多属性。或者我可以简单地使用do: b = copy.deepcopy(a) …但如果可能的话,我宁愿不要。我还希望避免覆盖\uuuuu new\uuuu python中真的没有合适的方法来创建复制构造函数吗?我认为这是

我意识到有人问过类似的问题,尽管不是这样

我想为我的类的构造函数提供一个可选参数,如果它是我的类的实例,那么它将被复制。例如,类似(我知道此代码不起作用!):

我知道有一些切实可行的解决办法。我可以根据foo对应属性的值设置self的每个属性,但这真的很烦人,因为我的类有很多很多属性。或者我可以简单地使用do:

b = copy.deepcopy(a)
…但如果可能的话,我宁愿不要。我还希望避免覆盖
\uuuuu new\uuuu


python中真的没有合适的方法来创建复制构造函数吗?

我认为这是最适合python的方法——复制工厂方法

import copy

class Foo(object):
    def __init__(self):
        self.x = None
        self.y = None
        self.z = None
    def copy(self):
        return copy.deepcopy(self)

a = Foo()
a.x = 1
a.y = 2
a.z = 3

b = a.copy()
print b.x
print b.y
print b.z

这在python基本类型中相当常见(例如
dict.copy
)。它不是一个复制构造函数,但我不认为这是一个非常python的概念

这是可能的,因为您可以迭代传递给
\uuu init\uuu
的源对象上的所有属性,然后在
self
上迭代您关心的属性。但目前还不清楚这是否是解决问题的好办法。不太像Pythonic,等等。

实现这一点的一个好方法是创建实例名称空间的顶级副本

class Tst:
    def __init__(self, somearg):
        if isinstance(somearg, self.__class__):
            self.__dict__ = somearg.__dict__.copy()
        else:
            self.var = somearg
    def echo(self):
        print(self.var)

a = Tst(123)
b = Tst(456)
a.echo()        # gives 123
b.echo()        # gives 456
c = Tst(a)
c.echo()        # gives 123
c.var is a.var  # gives False -> different objects

但是如果你的类处理
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?我的意思是,如果它能工作,并且它不需要比b=Foo(a)更多的行来写…好吧,我想我的手指仍然交叉着,一个复制构造函数是可行的。坦白说,为什么不是呢?这并不是一个真正不寻常的要求。有人会认为所有面向对象的语言都会有这个特性,为什么它不是一个特性呢?因为这只是句法上的糖分,用不同的方式表达完全相同的东西。只要功能存在,只需一行非常简单的代码就可以制作一个深度副本,那么它是否是“构造函数”又有什么关系呢?这是我在问题中忘记提到的另一个想法。我喜欢这个比b=copy.deepcopy(a)至少。非常感谢。我也很想知道,但它确实看起来不太像蟒蛇。无论如何,谢谢你。
class Tst:
    def __init__(self, somearg):
        if isinstance(somearg, self.__class__):
            self.__dict__ = somearg.__dict__.copy()
        else:
            self.var = somearg
    def echo(self):
        print(self.var)

a = Tst(123)
b = Tst(456)
a.echo()        # gives 123
b.echo()        # gives 456
c = Tst(a)
c.echo()        # gives 123
c.var is a.var  # gives False -> different objects