À propos des objets et des classes Python

Comment gérer les classes lors de la création de votre propre modèle MTV Je vais le laisser comme mémo parce que je l'ai appris.

Le contenu est un contenu rudimentaire au cours du processus élémentaire. Je mettrai à jour ce que j'ai appris de temps en temps.

Définition de classe

sample.py


class Person(object):
    def eat(self):
        print('eat')

person = Person()
person.eat()

Résultat de sortie


eat

Il n'est pas nécessaire d'avoir l'objet comme argument, mais il vaut mieux le décrire comme un vestige du système python2 (comme un style de code). Vous pouvez appeler la classe avec person = Person ().

Constructeur et destructeur

sample.py


class Person(object):
    """constructeur"""
    def __init__(self, food):
        self.food = food
        print('Food is ready')

    def eat(self):
        print('eat {}'.format(self.food))

    """Destructeur"""
    def __del__(self):
        print('Thanks for the food')

person = Person('apple')
person.eat()
del person #Peut également être écrit explicitement

Résultat de sortie


Food is ready
eat apple
Thanks for the food

Le constructeur est la première chose appelée lors de la création d'un objet. Les destructeurs, en revanche, sont appelés lorsqu'un objet est épuisé. Puisque la méthode __init__ du constructeur est appelée au tout début, elle est utilisée lors de la description des paramètres initiaux. Il existe d'autres méthodes telles que la méthode «new». self.food peut également être appelé à partir d'autres méthodes.

Héritage de classe

sample.py


class Animal(object):
    def eat(self):
        print('eat')

class Monkey(Animal):
    def eat(self, food):
        self.food = food
        print('eat {}'.format(self.food))

class Cheetah(Animal):
    def run(self):
        print('run')

animal = Animal()
animal.eat()
print('###########')
monkey = Monkey()
monkey.eat('banana') #Remplacement de méthode
print('###########')
cheetah = Cheetah()
cheetah.eat() #Héritage de classe
cheetah.run() #Expansion fonctionnelle

Résultat de sortie


eat
###########
eat banana
###########
eat
run

Si vous passez la classe parente à l'argument de la classe enfant, vous pouvez utiliser les fonctions de la classe parente. Il peut être utilisé lorsque vous souhaitez étendre la fonction de la classe parente uniquement dans un certain cas. Vous pouvez également remplacer la fonction par une classe enfant.

Appel de méthode parent par super

sample.py


class Animal(object):
    def __init__(self, food=None):
        self.food = food

    def eat(self):
        print('eat')

class Monkey(Animal):
    def __init__(self, food):
        super().__init__(food)

    def eat(self):
        print('eat {}'.format(self.food))


animal = Animal()
animal.eat()
print('###########')
monkey = Monkey('banana')
monkey.eat()

Résultat de sortie


eat
###########
eat banana

Après que la fonction init de la classe parent soit appelée par super () La fonction init de la classe enfant est exécutée.

Propriété (getter / setter)

sample.py


class Animal(object):
    def __init__(self, food=None, password=None):
        self._food = food
        self.password = password

    """getter"""
    @property
    def food(self):
        return self._food

    """setter"""
    @food.setter
    def food(self, food):
        if self.password == 'pass':
            self._food = food
        else:
            # raise ValueError
            print("Erreur") #Pour confirmation

animal = Animal('banana', password='pass')
print(animal.food)
animal.food = "orange"
print(animal.food)
print("##############")
animal2 = Animal('banana')
print(animal2.food)
animal2.food = "orange"
print(animal2.food)

Résultat de sortie


banana
orange
##############
banana
Erreur

En utilisant les propriétés, vous pouvez lire les variables que vous ne souhaitez pas écraser de l'extérieur. On dit qu'elle peut être explicitement exprimée lorsque vous ne souhaitez pas que la valeur soit réécrite. Il est possible d'éviter une situation dans laquelle un tiers exécute une opération non prévue par le concepteur et une erreur se produit. _Nom de la variable En ajoutant un trait de soulignement On dit qu'il est logique de le cacher de l'extérieur. Comme cela n'a pratiquement aucun effet sur le fonctionnement réel, il est possible de se référer directement à la variable.

Le getter ajoute @ property et fait du nom de la fonction le nom de la variable cible.

Le setter peut être défini avec .setter sur le nom de la fonction pour laquelle la propriété est définie. On dit qu'il est utilisé lorsqu'il n'est acceptable d'écraser que sous certaines conditions.

__ Nom de la variable Il existe également une méthode pour ajouter deux traits de soulignement, mais dans la classe parent et la classe enfant Lorsque le nom de la méthode est dupliqué, il est généralement utilisé dans le but d'éviter les conflits. Veuillez consulter ici pour plus de détails.

Variable de classe

sample.py


class Person(object):
    eated_list = [] #Variable de classe

    def eat(self, food):
        print('eat {}'.format(food))
        self.eated_list.append(food)

personA = Person()
personA.eat("apple")
print(personA.eated_list)

personB = Person()
personB.eat("orange")
print(personB.eated_list)

Résultat de sortie


eat apple
['apple']
eat orange
['apple', 'orange']

Une variable de classe est une variable qui peut être partagée par tous les objets générés. Par conséquent, il existe un risque que les informations que vous ne souhaitez pas partager entre les objets soient partagées comme le code ci-dessus. Pour éviter cela, introduisez la variable dans la méthode __init__ et Chaque fois qu'un objet est créé, il est nécessaire de décrire le processus d'initialisation de la variable.

Recommended Posts

À propos des objets et des classes Python
À propos des variables et des objets Python
[Python] À propos des classes Executor et Future
Parler d'anciennes et de nouvelles classes en Python
[Introduction à Python3 Jour 12] Chapitre 6 Objets et classes (6.3-6.15)
[Introduction à Python3 Jour 11] Chapitre 6 Objets et classes (6.1-6.2)
À propos de Python, len () et randint ()
À propos de la date et du fuseau horaire Python
À propos de Python et des expressions régulières
À propos des opérations Python et OS
Python # À propos de la référence et de la copie
À propos de Python sort () et reverse ()
À propos de _ et __
À propos de l'installation des séries Pwntools et Python2
objet perl et classe python partie 2.
ABC pour les classes abstraites Python et la saisie de canard
Python: une note sur les classes 1 "Résumé"
À propos de Python dict et des fonctions triées
À propos de Python et Cython dtype
Affectations et modifications des objets Python
Ce qui était surprenant dans les classes Python
À propos de Python Pickle (cPickle) et Marshal
À propos de Python, à partir et à l'importation, comme
objet perl et classe python partie 1.
Classes et instances Python, méthodes d'instance
À propos des tranches Python
À propos de la notation d'inclusion de python
À propos de Python tqdm.
À propos du rendement Python
Lier des méthodes aux classes et instances Python
À propos de python, classe
À propos de l'héritage Python
À propos de python, range ()
À propos de Python Decorator
Une histoire sur Python pop and append
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
Parler des attributs de classe Python et des métaclasses
Comment fonctionnent les classes python et les méthodes magiques.
Organiser la signification des méthodes, des classes et des objets
Pensez aux recherches de priorité de profondeur et de priorité de largeur en Python
À propos de la différence entre "==" et "is" en python
[Hikari-Python] Chapitre 09-02 Classes (Création et instanciation de classes)
Une histoire sur la modification de Python et l'ajout de fonctions
[Python] En savoir plus sur la programmation asynchrone et les boucles d'événements
[Hikari-Python] Chapitre 09-01 Classes (Bases des objets)
À propos des copies superficielles et profondes de Python / Ruby
[python] Compresser et décompresser
À propos de la classe et de l'instance
À propos des arguments de fonction (python)
Itérateur et générateur Python
Paquets et modules Python
Intégration Vue-Cli et Python
[Python] Mémo sur les fonctions
Les classes Python sont lentes
Ruby, Python et carte
Résumé sur Python3 + OpenCV3
À propos de cumprod et cummax