假設我有這個簡單的課程:
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
建構函數,因為name
和id
應僅在一個位置聲明。
選項:
使用 copy
或 deepcopy
。這將提供我需要的功能,但每次我想使用 tom
時,我都必須記住創建他的副本。這太笨重了。
建立 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中文網其他相關文章!