Python: une note sur les classes 1 "Résumé"

Résumé: De la façon d'utiliser les pièces à la façon de combiner

Nous n'utiliserons pas seulement des fragments de programme, mais nous procéderons également à l'apprentissage vers la mise en œuvre de programmes qui les combinent.

Statut actuel

Grâce à la vaste bibliothèque et aux commentaires, j'ai réussi à réaliser la petite idée que je voulais faire et que je voulais faire. D'un autre côté, si vous essayez de les combiner pour faire un programme, le tout sera foiré et vous ne pourrez pas le gérer.

Par conséquent, ici, nous allons organiser ce que nous avons appris sur la classe et résumer diverses questions dans le but de créer un "programme qui peut être développé et maintenu par nous-mêmes". En tant que programmeur encore débutant, les conseils sont les bienvenus.

Abstraction de classe

Définissez le degré d'abstraction de manière appropriée

La dénomination est importante dans le programme. Si vous lui donnez un nom approprié, cela entravera votre compréhension et votre reconnaissance. Par conséquent, pour bien saisir à quoi ressemble tout cela, le degré d'abstraction doit être déterminé en fonction de la situation.

Degré d'abstraction

Si vous recherchez "abstraction de classe Python", la plupart des informations concernent l'utilisation des métaclasses. C'est une partie qui était étonnamment difficile à comprendre.

À titre d'exemple, imaginez la situation de créer un jeu de rôle classique de fantasy occidentale. Quel genre de nom devrions-nous donner lors de la création d'une classe qui traite d'un personnage, John, un villageois?

Tout d'abord, comme prémisse, diverses choses dans le monde appartiennent à plusieurs groupes en même temps. Bien sûr, John ne fait pas exception.

概念図.png

Il y a beaucoup de noms que John peut donner, juste pour un rapide coup d'œil. Un objet qui est tous les objets (terrains, arbres, bâtiments, personnages, etc.) qui existent dans le jeu. La créature est une chose vivante parmi les êtres vivants et les objets inanimés. Humanoïde, une créature humanoïde pouvant inclure des elfes et des nains ainsi que des gens ordinaires. À la suite d'un traçage sans fin parmi les créatures humanoïdes, nous arrivons au villageois John.

Trop haut degré d'abstraction

Quand il s'agit de "Aimeriez-vous créer Créature pour créatures pour le moment?", Je pense que la mise en œuvre sera la suivante.

creature.py


class Creature:
    def __init__(self, hp, mp, start_position, area):
        self.hp = hp
        self.mp = mp
        self.position = start_position
        self.area = area
        self.oxygen = 100
    
    def move(self, next_position):
        if self.area == "land":
            self.walk()
            self.position = next_position
        
        elif self.area == "water":
            self.swim()
            self.position = next_position
        
        elif self.area == "sky":
            self.fly()
            self.position = next_position
    
    def walk(self):
        print("Teku Teku")

    def swim(self):
        print("Sui")
    
    def fly(self):
        print("Byun")

Puisqu'il s'agit d'un groupe appelé Créature, il sera nécessaire de séparer au moins les créatures qui vivent sur le sol, les créatures qui vivent sous l'eau et les créatures qui vivent dans les airs. Considérant que les créatures vivant au sol pénètrent dans l'eau, je sens que je dois gérer la quantité d'oxygène. La gestion du poids semble être importante pour les créatures vivant dans les airs.

De plus, puisque nous pensons cette fois au monde fantastique, il est possible que certaines créatures vivent dans le monde des démons contaminés par l'humour, et certaines vivent dans le sol où il n'y a pas de lumière. Parallèlement à cela, on peut s'attendre à ce que le nombre de choses à mettre en œuvre augmente à un rythme accéléré, comme les différentes méthodes de mouvement et l'établissement d'un statut unique.

Abstraction trop faible

Si vous pensez, "à part le reste, voulez-vous le garder en tant que villageois?", Je pense que la mise en œuvre sera la suivante.

villager.py


class Villager:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position
    
    def move(self, next_position):
        self.position = next_position
        print("Teku Teku")
    
    def speak(self, line="Bonjour. C'est le village de départ"):
        print(f"{self.name}「{line}」")

villagerA = Villager("John", 100, [0,0])
villagerA.speak()
villagerA.speak("D'où viens-tu?")

#Résultat d'exécution
'''
John "Bonjour. C'est le village du début."
John "D'où viens-tu?"
'''

C'est différent du précédent, et ce n'est que pour les villageois, il est donc facile de réfléchir à ce qu'il faut mettre en œuvre. Si vous le traitez comme un PNJ, vous devriez vous en promener de manière appropriée et, lorsque vous lui parlez, prononcez les lignes appropriées.

D'un autre côté, il y a une volonté de le mettre en œuvre proprement. Par exemple, lorsque vous envisagez de créer une ville-château et d'y placer des PNJ, ce villageois semble être utilisé avec un peu de bricolage. La fonction de base de bouger et de parler reste la même.

Compte tenu de l'extensibilité plus tard, il semble que le nom Villager n'est pas le meilleur. Essayez de subdiviser le salon ou ajoutez des caractéristiques à chaque espace de vie. C'est une extension comme créer un enfant qui ne peut pas attaquer pour donner une variation, ou un voyou qui peut attaquer.

Abstraction appropriée

Alors qu'est-ce qu'un nom avec le bon degré d'abstraction qui n'est ni trop haut ni trop bas? Cela peut changer autant que vous le souhaitez en fonction des spécifications, mais les points raisonnables sont les suivants.

resident.py


class Resident:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position
    
    def move(self, next_position):
        self.position = next_position
    
    def speak(self, line="Bonjour"):
        print(f"{self.name}「{line}」")

citizenA = Resident("John", 100, [0,0])
citizenA.speak()
villagerA = Resident("Mary", 100, [0,10])
villagerA.speak("Bonjour. Est-ce que c'est South City?")

#Résultat d'exécution
'''
John "Bonjour"
Mary "Bonjour. Est-ce une ville du sud?"
'''

Je l'ai nommé résident parce qu'il vit quelque part. Cela inclut les villageois et les citoyens. Il peut être acceptable de créer un citoyen de la ville aérienne.

Résumé

Plus le niveau d'abstraction est élevé, plus il y a de choses à mettre en œuvre. En prenant un véhicule comme exemple, si vous essayez de le mettre en œuvre en tant que transport au lieu de voiture, il inclura les avions et les navires, et la quantité de mise en œuvre augmentera à nouveau.

D'autre part, abaisser le degré d'abstraction réduit la quantité de travail à mettre en œuvre, mais réduit naturellement la plage d'utilisation. De même, en prenant un véhicule comme exemple, la mise en œuvre de Bus au lieu de Car réduira la portée de l'examen et facilitera la mise en œuvre. D'un autre côté, compte tenu de l'application à Taxi, qui transporte également des clients, il faudra encore du temps et des efforts.

De côté

À partir de la prochaine fois, nous prévoyons de résumer la classe de base abstraite et l'héritage et la synthèse / délégation.

Recommended Posts

Python: une note sur les classes 1 "Résumé"
Une note sur [python] __debug__
Une note sur mock (bibliothèque fictive Python)
Une note sur __call__
Une note sur le sous-processus
Une note sur mprotect (2)
Écrire une note sur la version python de python virtualenv
Analyse de données en Python: une note sur line_profiler
À propos des objets et des classes Python
Une note sur KornShell (ksh)
Mémorandum sur la corrélation [Python]
Une note sur TensorFlow Introduction
Un mémorandum sur le simulacre de Python
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Remarque à propos de get_scorer de sklearn
Ce qui était surprenant dans les classes Python
Remarque: Python
[Python] À propos des classes Executor et Future
Note de Python
Une note où un débutant Python s'est retrouvé coincé
Un programmeur Java a étudié Python. (À propos du type)
Une histoire sur Python pop and append
Parler d'anciennes et de nouvelles classes en Python
À propos du 02 février 2020 * Ceci est un article Python.
Un mémo que j'ai essayé le tutoriel Pyramid
À propos des tranches Python
À propos de la notation d'inclusion de python
Note d'apprentissage Python_002
Remarque: décorateur Python
Note de programmation Python
[Python] Note d'apprentissage 1
À propos de Python tqdm.
À propos de python, classe
Note d'apprentissage Python_004
À propos de l'héritage Python
À propos de python, range ()
Note d'apprentissage Python_003
À propos de Python Decorator
[Remarque] openCV + python
Remarque sur awk
Juste une note
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
Note du débutant Python
Un programmeur Java a étudié Python. (À propos des fonctions (méthodes))
Un programmeur Java a étudié Python. (À propos des décorateurs)
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Un mémo que j'ai écrit un tri de fusion en Python
Notes de programme simples Pub / Sub en Python
Remarque Python: lors de l'attribution d'une valeur à une chaîne
Une histoire sur l'exécution de Python sur PHP sur Heroku
Pensez à créer un environnement Python 3 dans un environnement Mac
Un mémorandum sur la bibliothèque de wrapper Python tesseract
[Note] À propos du rôle du trait de soulignement "_" en Python
Une note sur la nouvelle classe de base de style
Modificateurs de vérification des mémos avec MaxPlus
Une histoire sur la modification de Python et l'ajout de fonctions
À propos de Python for loop