首頁 >後端開發 >Python教學 >Python語法糖產生同一類別的相同實例?

Python語法糖產生同一類別的相同實例?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB轉載
2024-02-08 23:12:26698瀏覽

Python語法糖產生同一類別的相同實例?

問題內容

假設我有這個簡單的課程:

class person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

以及以下實例:

tom = person('tom', 12)
dick = person('dick', 14)
harry = person('harry', 16)

但我希望我的模組的使用者能夠建立這些人的多個實例,而不必呼叫person 建構函數,因為nameid 應僅在一個位置聲明。

選項:

  1. 使用 copydeepcopy。這將提供我需要的功能,但每次我想使用 tom 時,我都必須記住創建他的副本。這太笨重了。

  2. 建立 tom 類別

class Tom(Person):
    def __init__(self):
        super().__init__('Tom', 12)

這更乾淨一些,因為每次我想要一個新的tom 時,我都可以執行tom() ,但這需要編寫大量程式碼,而且不是很乾燥。

python 中是否有其他語法糖可以讓這種事情變得更容易?


正確答案


我認為這是工廠/註冊表類型模式的一個很好的用例。這個想法是為類別和單一註冊表字典實現一個替代的方便建構函數,該字典儲存與給定標籤相對應的配置。看一下下面的例子:

person_registry = {
    "tom": {"name": "tom", "id": 12},
    "jerry": {"name": "jerry", "id": 13},
    "dick": {"name": "dick", "id": 14},
}


class person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

    @classmethod
    def from_tag(cls, tag):
        """create a person from a tag"""
        if tag not in person_registry:
            raise valueerror(f"not a valid tag {tag}, choose from {list(person_registry)}")
        
        return cls(**person_registry[tag])
    
print(person.from_tag("tom"))

現在您可以匯入 person 類別並從較短的標籤建立實例,而實際資料儲存在一個位置,即 person_registry 字典中。如果你想減少冗長,你也可以 使用位置參數,但關鍵字參數通常更可取,因為更明確(python 的 zen)。

這種模式的優點在於它實際上是可擴展的。因此使用者可以擴充 person_registry 字典,例如:

from persons import Person, PERSON_REGISTRY

PERSON_REGISTRY["liz"] = {"name": "elizabeth", "id": 23}

liz = Person.from_tag("liz")

我希望這會有所幫助。

以上是Python語法糖產生同一類別的相同實例?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除