Supposons que j'ai ce cours simple :
class person: def __init__(self, name, id): self.name = name self.id = id
Et les exemples suivants :
tom = person('tom', 12) dick = person('dick', 14) harry = person('harry', 16)
Mais je souhaite que les utilisateurs de mon module puissent en créer plusieurs instances sans avoir à appeler person
构造函数,因为 name
和 id
qui doivent être déclarées à un seul endroit.
Options :
Chaque fois que j'utilise copy
或 deepcopy
。这将提供我需要的功能,但每次我想使用 tom
, je dois penser à en créer une copie. C'est trop volumineux.
Créer tom
classe
class Tom(Person): def __init__(self): super().__init__('Tom', 12)
C'est un peu plus propre car chaque fois que je veux un nouveau tom
时,我都可以执行 tom()
, je peux simplement faire tom()
, mais cela fait beaucoup de code à écrire et ce n'est pas très sec.
Existe-t-il un autre sucre syntaxique en python qui rendrait ce genre de chose plus facile ?
Je pense que c'est un bon cas d'utilisation pour le modèle de type usine/registre. L'idée est d'implémenter un constructeur pratique alternatif pour les classes et un dictionnaire de registre unique qui stocke la configuration correspondant à une balise donnée. Jetez un œil à l'exemple ci-dessous :
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"))
Vous pouvez maintenant importer dans person
类并从较短的标签创建实例,而实际数据存储在一个位置,即 person_registry
dictionnaire. Si vous souhaitez réduire la verbosité, vous pouvez également
Utilisez des arguments de position, mais les arguments de mots-clés sont souvent préférables car ils sont plus explicites (le zen de Python).
La beauté de ce modèle est qu’il est réellement évolutif. Ainsi l'utilisateur peut étendre le person_registry
dictionnaire, par exemple :
from persons import Person, PERSON_REGISTRY PERSON_REGISTRY["liz"] = {"name": "elizabeth", "id": 23} liz = Person.from_tag("liz")
J'espère que cela aide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!