Maison >développement back-end >Tutoriel Python >Sucre syntaxique Python pour générer des instances identiques de la même classe ?

Sucre syntaxique Python pour générer des instances identiques de la même classe ?

WBOY
WBOYavant
2024-02-08 23:12:26666parcourir

Sucre syntaxique Python pour générer des instances identiques de la même classe ?

Contenu de la question

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 构造函数,因为 nameid qui doivent être déclarées à un seul endroit.

Options :

  1. Chaque fois que j'utilise copydeepcopy。这将提供我需要的功能,但每次我想使用 tom, je dois penser à en créer une copie. C'est trop volumineux.

  2. 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 ?


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer