Quelle est la bonne manière de prolonger un parent de la classe de la méthode moderne de Python
J'ai souvent ce genre de chose:
class Person(object):
def greet(self):
print "Hello"
class Waiter(Person):
def greet(self):
Person.greet(self)
print "Would you like fries with that?"
La ligne de Personne.saluer(auto) ne semble pas juste. Si jamais je changer ce Garçon de la classe hérite de je vais avoir la trace de chacune de ces et de les remplacer tous.
Quelle est la bonne façon de le faire est moderne Python? 2.x et 3.x, je comprends qu'il y ait eu des changements dans ce domaine 3.
Si c'est important tout de manière générale, j'en tenir à l'héritage simple, mais si des trucs supplémentaires sont requises pour accueillir l'héritage multiple correctement, il serait bon de savoir à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Vous utilisez
super
:En d'autres termes, un appel à
super
retourne un faux objet qui délégués attribut recherches pour les classes au-dessus de vous dans la chaîne d'héritage. Points à noter:object
.super
en Python 2.x. Cette exigence a été abandonnée dans 3.x.Prendre soin: il y a de nombreux endroits pour obtenir confus au sujet de l'héritage multiple en Python. Vous voudrez peut-être lire
super()
Considéré comme Nocif. Si vous êtes sûr que vous allez en tenir à un seul arbre d'héritage, et que vous n'envisagez pas de changer les noms de classes dans le dit de l'arbre, vous pouvez coder en dur les noms de classe comme vous le faites ci-dessus et tout fonctionnera correctement.Waiter
dans lesuper()
fonction, ne pas utiliser le nom de la classe, maisself.__class__
. De cette façon, vous n'aurez pas de réécriture de tous vos super en cas de modification de votre nom de classe dans l'avenir. Comme ceci (à l'intérieur deWaiter.greet()
):super(self.__class__, self).greet()
.Ne sais pas si vous êtes à la recherche pour cela, mais vous pouvez faire appel à un parent sans en parler à elle en faisant cela.
Ce qui fera appel à la
greet()
fonction dansPerson
.super(self.__class__, self).greet()
. De cette façon, dans le cas où vous modifiez le nom du Serveur, vous n'avez pas à réécrire votre super de.katrielalex la réponse est vraiment la réponse à votre question, mais cela ne rentrait pas dans un commentaire.
Si vous prévoyez d'aller sur l'aide de
super
partout, et vous jamais penser en termes d'héritage multiple, absolument lire le "super() est Considéré comme Nocif" lien.super()
est un excellent outil, mais il faut comprendre pour l'utiliser correctement. Dans mon expérience, pour des choses simples qui ne semblent pas susceptibles d'entrer dans de compliqué diamant héritage enchevêtrements, il est effectivement plus facile et moins fastidieux il suffit d'appeler la super-classe directement et de traiter avec le renomme lorsque vous modifiez le nom de la classe de base.En fait, en Python2 vous devez inclure l'actuel nom de la classe, qui est généralement plus enclins à changer que le nom de classe de base. (Et, en fait, il est parfois très difficile de passer d'une référence à la classe en cours si vous êtes en train de faire loufoque choses; au moment où la méthode est définie la classe n'est pas lié à un nom, et au moment où le
super
appel est exécuté à l'origine le nom de la classe peuvent ne pas toujours être lié à la classe, comme lorsque vous utilisez une classe décorateur)