簡體   English   中英

如何在新的 class 中實例化 object?

[英]How to instantiate an object in a new class?

有點奇怪的問題,但我想知道如何將 object 從一個 class 導入另一個。 我想在擴展程序時添加更多 class 方法和屬性,並且我仍然希望能夠使用舊數據。 我的想法如下:

class old_obj:

    def __init__(self, text):
        self.name = text

    def set_amount(self, num):
        self.amount = num

    def introduce_yourself(self):
        print("I am {} and I am {} many".format(self.name, self.amount))

oldest = old_obj("myself")
oldest.set_amount(15)
also_old = old_obj("Bach")

class new_obj:
    def __init__(self):
        #some code
    #more code

我希望能夠寫出類似的東西:

renewed = new_obj(oldest)
also_new = new_obj(also_old)

在這里,我想保留oldest.amount中的15 ,但不要抱怨also_old.amountNone 特別是,我想保留oldest的所有屬性,而不要求它具有所有可能的屬性。 有沒有辦法讓我將 class 的實例復制到新的 class?

編輯:為清楚起見進行了編輯

您可以將 object 實例字典復制到新的 class。

from copy import deepcopy

class old_obj:

    def __init__(self, text):
        self.name = text

    def set_amount(self, num):
        self.amount = num

    def introduce_yourself(self):
        print("I am {} and I am {} many".format(self.name, self.amount))

oldest = old_obj("myself")

class new_obj:
    def __init__(self, my_old_obj):
        for var, val in my_old_obj.__dict__.items():
            setattr(self, var, deepcopy(val))
        #some code
    #more code

newest = new_obj(oldest)

假設您想要新的 object 中的唯一值,我對值進行了深度復制。 但這也可能有問題,因為並非所有內容都可以復制(例如文件對象)。 復制屬性時可能會出現其他奇怪的情況,例如您想用生成器做什么。 如果這是一個類似於 GUI 小部件的東西,它可能會變得更加陌生。

但是對於很多 object 類型,這會起作用。

您可以簡單地通過傳遞舊的 object 來初始化新的 object。

class old_obj:
    def __init__(self, text):
        self.text = text

oldest = old_obj("myself")

class new_obj:
    def __init__(self, old_inst):
        self.text = old_inst.text 

renewed = new_obj(oldest)

print(renewed.text)

首先,讓你的new_obj class 繼承自old_obj ,這樣new_obj就擁有old_obj的所有方法:

class new_obj(olb_obj):

然后,在新 class 的__init__方法中,您可以檢查作為參數傳遞的內容 - 字符串或 object:

    def __init__(self, arg):
        if isinstance(arg, str):
            self.text = arg
        elif isinstance(arg, old_obj):
            self.text = arg.text 
        else:
            raise TypeError

略有不同的取法:

您的新 class 有一組可能與您的舊 class 類似的問題。 這應該指導您更新它並建立有問題的行為的方式。 考慮到這一點...

  1. 在新的 class 中提供 class 方法,以允許從舊的 ZA8CFDE6331BD59EB2AC96F8911ZB4 構造新的 object。 不要讓這種行為成為__init__的一部分。 您的__init__應該承擔更有限的責任。 對於 class 方法,使用舊對象的__dict__ __dict__可以了。

  2. 不要使用 inheritance 來制作新版本的類。 使用 inheritance 從一般到具體或從抽象到具體。 否則,您最終會得到難以理解和更新的代碼。 (想象一下為了添加一些新方法而只進行子類化的幾代人。)

  3. 如果方法和屬性的數量在增長,您可能需要考慮是否要封裝應拆分為多個類的數據/行為。 指導原則是你應該封裝可能一起改變的數據/行為。 也就是說,當您更改實現程序的方式時,不需要更改的內容可能應該與需要更改的內容分開封裝。 如果您發現您經常更新的很多 static 數據與 object class 綁定在一起(但可能只想導入舊數據不變,那么至少有兩組不同的問題)。

暫無
暫無

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

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