Syntaktischer Python-Zucker, um identische Instanzen derselben Klasse zu generieren?

WBOY
Freigeben: 2024-02-08 23:12:26
nach vorne
635 Leute haben es durchsucht

Syntaktischer Python-Zucker, um identische Instanzen derselben Klasse zu generieren?

Frageninhalt

Angenommen, ich habe diese einfache Klasse:

class person:
    def __init__(self, name, id):
        self.name = name
        self.id = id
Nach dem Login kopieren

Und folgende Beispiele:

tom = person('tom', 12)
dick = person('dick', 14)
harry = person('harry', 16)
Nach dem Login kopieren

Aber ich möchte, dass Benutzer meines Moduls mehrere Instanzen davon erstellen können, ohne person 构造函数,因为 nameid aufrufen zu müssen, die nur an einer Stelle deklariert werden sollten.

Optionen:

  1. Jedes Mal, wenn ich copydeepcopy。这将提供我需要的功能,但每次我想使用 tom verwende, muss ich daran denken, eine Kopie davon zu erstellen. Das ist zu sperrig.

  2. Erstellen Sie tomKlasse

class Tom(Person):
    def __init__(self):
        super().__init__('Tom', 12)
Nach dem Login kopieren

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?


Richtige Antwort


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"))
Nach dem Login kopieren

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")
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage