[Python] Raison du remplacement à l'aide de super ()

À propos de cet article

Quand je regardais le code source de Django, j'en ai trouvé beaucoup qui utilisaient super () pour remplacer la classe. Voyons ce qu'est «super ()» et ce qui est différent de le remplacer sans l'utiliser.

Qu'est-ce qu'une dérogation

Pour définir une méthode portant le même nom que la classe de base dans la classe dérivée. Vous pouvez ajouter ou modifier des fonctions aux méthodes de la classe de base.

Définir la classe de base


#Classe de base
class Coffee(object):
    def __init__(self, color, fragrance, price, taste, elapsed_time):
        self.color = color
        self.fragrance = fragrance
        self.price = price
        self.satisfaction = ((taste + fragrance) * price) - elapsed_time
        
    def drink(self):
        print(f'la satisfaction{self.satisfaction}Boire Hoffy du point')


coffee = Coffee('brown', 10, 200, 10, 300)
coffee.drink() # <---Buvez Hoffy avec 3700 points de satisfaction

Maintenant que nous avons défini la classe de base, créons une classe dérivée ci-dessous avec et sans super (). (Les deux ont la même fonction)

Remplacer la classe de base (ne pas utiliser super ())

Créons une classe qui hérite de la classe Coffee et remplace la méthode.


#Après avoir repris Coffee, je souhaite étendre la fonction! !!

class Override(Coffee):
    #Si vous le remplacez normalement, le traitement de la classe de base sera invalidé, donc si vous souhaitez étendre le traitement, vous devez écrire le même traitement que la classe de base.
    def __init__(self, color, fragrance, price, taste, elapsed_time, size):
        self.color = color
        self.fragrance = fragrance
        self.price = price
        self.satisfaction = ((taste + fragrance) * price) - elapsed_time + size * 55
        self.size = size
        
    def size_up(self):
        self.price += 100
        self.size += 1
        print(f'la taille est{self.size}Devenu! Au lieu de cela, le prix a augmenté...')
        
    #La méthode de classe de base doit également être définie à nouveau à partir de zéro
    def drink(self):
        print(f'la satisfaction{self.satisfaction}Boire Hoffy du point')
        print(f'la taille est{self.size}C'était un peu trop...')

#Résultat de l'exécution Remplacement normal
override = Override('brown', 10, 200, 10, 300, 10)
override.drink() # <---Buvez Hoffy avec 4250 points de satisfaction,Je me demande si la taille 10 était un peu trop..
override.size_up() # <---La taille est maintenant de 11! Au lieu de cela, le prix a augmenté....

Remplacé les méthodes «__init __ ()» et «drink ()» de la classe de base. Si vous le remplacez normalement, le traitement de la classe de base sera invalidé, donc si vous souhaitez simplement étendre le traitement, vous devez écrire le même traitement que la classe de base, ce qui entraîne un code redondant.

Remplacer par super ()


class SuperOverride(Coffee):
    #Vous n'avez plus à écrire de code d'initialisation en appelant le constructeur de classe de base avec la fonction Super
    def __init__(self, color, fragrance, price, taste, elapsed_time, size):
        super().__init__(color, fragrance, price, taste, elapsed_time,)
        self.size = size
        
    def size_up(self):
        self.price += 100
        self.size += 1
        print(f'la taille est{self.size}Devenu! Au lieu de cela, le prix a augmenté...')
        
    #Les méthodes de classe de base sont appelées, il y a donc redondance
    def drink(self):
        super().drink()
        print(f'la taille est{self.size}C'était un peu trop...')

#Résultat d'exécution super()Remplacer avec des fonctions
super_override = SuperOverride('brown', 10, 200, 10, 300, 10)
super_override.drink() # <---Buvez Hoffy avec 4250 points de satisfaction,Je me demande si la taille 11 était un peu trop... 
super_override.size_up() # <---La taille est maintenant de 12! Au lieu de cela, le prix a augmenté...

La valeur passée aux paramètres (couleur, parfum, prix, goût, elapsed_time) de la méthode __init__ de SuperOverride est affectée aux paramètres de la classe de base (Coffee) et initialisée. Puisque la méthode de classe de base est appelée entièrement avec super (), la satisfaction est également héritée.

Notez que «super (). Drink ()» est synonyme de «super (SuperOverride self) .drink ()». En d'autres termes, vous pouvez écrire super (propre classe, self) .method name, mais vous pouvez l'omettre comme dans le code ci-dessus.

Résumé

Comme mentionné ci-dessus, vous pouvez enregistrer la description et rendre le code plus facile à lire en utilisant super () lorsque vous souhaitez étendre le traitement après avoir hérité de la méthode de la classe de base.

Recommended Posts

[Python] Raison du remplacement à l'aide de super ()
Python #function 2 pour les super débutants
Python #function 1 pour les super débutants
#List Python pour les super débutants
Python pour les super débutants Super débutants Python # dictionnaire type 1
Python #index pour les super débutants, tranches
[TouchDesigner] Conseils pour la déclaration par python
Fonction Python #len pour les super débutants
[Python] Quatre-vingt-dix-neuf tables utilisant des instructions for
Python #Hello World pour les super débutants
Python pour les super débutants Super débutants Python # dictionnaire type 2
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Environnement de développement Python pour macOS utilisant venv 2016
[50 comptes] Transmission de clé à l'aide de Python pour Windows
[python, multitraitement] Comportement des exceptions lors de l'utilisation du multitraitement
Mettons ensemble Python pour les super débutants
Conseils pour utiliser python + caffe avec TSUBAME
30/10/2016 else pour Python3> pour:
python [pour moi]
Commencez à utiliser Python
Scraping à l'aide de Python
vprof - J'ai essayé d'utiliser le profileur pour Python
Python pour les super débutants Super débutants Python # Facile à éliminer
Pandas Python: recherchez DataFrame à l'aide d'expressions régulières
Obtenir des informations sur les notes à l'aide du SDK Evernote pour Python 3
Recherche affinée des valeurs de race Pokemon à l'aide de Python
Compréhension facile de Python pour les tableaux et (pour les super débutants)
Faisons un module pour Python en utilisant SWIG
À propos de l'importation de modules externes Python <Pour les super débutants>
Analysons les données Covid-19 (Corona) en utilisant Python [Pour les débutants]
À propos de Python for loop
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Manipuler Redmine à l'aide de Python Redmine
Recherche de balises pixiv et enregistrement d'illustrations à l'aide de Python
Squelettes extensibles pour Vim utilisant Python, Click et Jinja2
Bases de Python ② pour déclaration
Séquence de Fibonacci utilisant Python
Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python
[Python] Débogage super utile
Remplacement de méthode et super
[Python] Héritage de classe (super)
À propos de Python, pour ~ (plage)
Nettoyage des données à l'aide de Python
Manuel python pour les débutants
Refactoring des outils utilisables avec Python
Utilisation des packages Python #external
Câblage Communication Pi-SPI avec Python
Toolchain pour Python pour Android
Calcul de l'âge à l'aide de python
Rechercher sur Twitter avec Python
Python # Comment vérifier le type et le type pour les super débutants
Identification de nom à l'aide de python
Notes sur l'utilisation de sous-processus Python
Mémo de construction d'environnement d'apprentissage automatique par Python
Essayez d'utiliser Tweepy [Python2.7]
OpenCV pour les débutants en Python
mémorandum python super basique
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
Installez Python (pour Windows)