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

WBOY
Libérer: 2024-02-08 23:12:26
avant
635 Les gens l'ont consulté

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
Copier après la connexion

Et les exemples suivants :

tom = person('tom', 12)
dick = person('dick', 14)
harry = person('harry', 16)
Copier après la connexion

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)
Copier après la connexion

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"))
Copier après la connexion

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")
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal