Heim  >  Artikel  >  Backend-Entwicklung  >  Syntaktischer Python-Zucker, um identische Instanzen derselben Klasse zu generieren?

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

WBOY
WBOYnach vorne
2024-02-08 23:12:26636Durchsuche

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

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 构造函数,因为 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)

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"))

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen