簡體   English   中英

如何在 Python 中完全復制一個類實例? copy.deepcopy 不起作用

[英]How to completely copy a class instance in Python? copy.deepcopy doesn't work

假設我有一個簡單的 python 類,例如

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

我想做一個函數來復制這個類中的所有內容。 我面臨的問題是,當我使用copy.deepcopy(<class instance>)時,由於參數是pygame.Surface對象,因此無法使用該函數進行復制。 如何創建一個創建類實例並將指向它的指針存儲在變量中的函數?

編輯:最好有一個簡單的屬性,例如

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

首先,我想指出這並非巧合。 您通常不想復制圖像,因為它會占用大量內存。

如果你還想那么:

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

您不能pygame.Surface deepcopy ,但是pygame.Surface有一個copy方法。 請參閱復制精靈

您的代碼的問題是您在對象構造函數中加載了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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM