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.
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.
#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)
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.
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.
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