如何在 Python 中完全复制类实例?copy.deepcopy 不起作用



假设我有一个简单的python类,例如

class A():
def __init__(self, b):
self.b = pygame.image.load(b)

我想创建一个函数来复制这个类中的所有内容。我面临的问题是,当我使用copy.deepcopy(<class instance>)时,由于参数是pygame.Surface对象,它无法复制该函数。如何创建一个函数来创建一个new类实例并将指向它的指针存储在new变量中?

编辑:它会比有一个简单的属性,如

class A():
def __init__(self, b):
self.b = pygame.image.load(b)
@property
def clone(self):
<code to copy>

您不能deepcopypygame.Surface对象,但是pygame.Surfacecopy方法。参见复制精灵。

代码的问题是在对象构造函数中加载了Surface。这是不好的做法,会导致你的问题。在初始化时加载图像,并将图像传递给对象的构造函数。如果您想在类中封装文件的加载,请使用@staticmethod:

class A():
@staticmethod
def new():
image = pygame.image.load('my_image_file.png')
return A(image)
def __init__(self, image):
self.image = image
def clone(self):
return A(self.image.copy())
a = A.new()
copy_of_a = a.clone()
无论如何,绝对没有必要复制pygame.Surface。通常surface是静态的,根本不会改变。它只存储对象的图形表示,而不存储其他信息。许多对象可以共享同一个Surface对象。您不必复制Surface,只需共享它,这节省了大量内存并提高了性能:
class A():
def __init__(self, image):
self.image = image
def clone(self):
return A(self.image)

首先,我要说明这不是巧合。您通常不希望复制图像,因为它占用大量内存。

如果你还想,那么:

class A:
def __init__(self, b):
self.b = pygame.image.load(b)
# @property is not good here. Keep it as a method
def copy(self):
c = copy.deepcopy()
# pygame.Surface.copy method
c.b = self.b.copy()
return c

最新更新