Heim > Artikel > Backend-Entwicklung > Syntaktischer Python-Zucker, um identische Instanzen derselben Klasse zu generieren?
Angenommen, ich habe diese einfache Klasse:
class person: def __init__(self, name, id): self.name = name self.id = id
Und folgende Beispiele:
tom = person('tom', 12) dick = person('dick', 14) harry = person('harry', 16)
Aber ich möchte, dass Benutzer meines Moduls mehrere Instanzen davon erstellen können, ohne person
构造函数,因为 name
和 id
aufrufen zu müssen, die nur an einer Stelle deklariert werden sollten.
Optionen:
Jedes Mal, wenn ich copy
或 deepcopy
。这将提供我需要的功能,但每次我想使用 tom
verwende, muss ich daran denken, eine Kopie davon zu erstellen. Das ist zu sperrig.
Erstellen Sie tom
Klasse
class Tom(Person): def __init__(self): super().__init__('Tom', 12)
Das ist etwas übersichtlicher, denn jedes Mal, wenn ich ein neues tom
时,我都可以执行 tom()
möchte, kann ich einfach tom()
ausführen, aber das ist eine Menge Code zum Schreiben und es ist nicht sehr trocken.
Gibt es einen anderen syntaktischen Zucker in Python, der so etwas einfacher machen würde?
Ich denke, das ist ein guter Anwendungsfall für das Fabrik-/Registrierungstypmuster. Die Idee besteht darin, einen alternativen praktischen Konstruktor für Klassen und ein einzelnes Registrierungswörterbuch zu implementieren, das die einem bestimmten Tag entsprechende Konfiguration speichert. Schauen Sie sich das folgende Beispiel an:
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"))
Jetzt können Sie in person
类并从较短的标签创建实例,而实际数据存储在一个位置,即 person_registry
das Wörterbuch importieren. Wenn Sie die Ausführlichkeit reduzieren möchten, können Sie dies auch tun
Verwenden Sie Positionsargumente, aber Schlüsselwortargumente sind oft vorzuziehen, weil sie expliziter sind (Pythons Zen).
Das Schöne an diesem Muster ist, dass es tatsächlich skalierbar ist. So kann der Benutzer das person_registry
-Wörterbuch erweitern, zum Beispiel:
from persons import Person, PERSON_REGISTRY PERSON_REGISTRY["liz"] = {"name": "elizabeth", "id": 23} liz = Person.from_tag("liz")
Ich hoffe, das hilft.
Das obige ist der detaillierte Inhalt vonSyntaktischer Python-Zucker, um identische Instanzen derselben Klasse zu generieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!