Comment l'héritage multiple travailler avec le super() et __init__() arguments?
Je suis juste de plonger dans certains plus avancés python sujets (bien, avancé pour moi au moins). Je suis en train de lire à propos de l'héritage multiple et comment vous pouvez les utiliser à super(). J'ai plus ou moins comprendre le fonctionnement de la super fonction est utilisée, mais (1) Quel est le problème avec le faire juste comme ça?:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
First.__init__(self)
Second.__init__(self)
print "that's it"
À super(), Andrew Kuchlings papier sur Python Verrues dit:
utilisation de super() sera aussi correct lorsque la classe Dérivée hérite
à partir de plusieurs classes de base et tous ou certains d'entre eux ont init
méthodes
J'ai donc réécrit l'exemple ci-dessus comme suit:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__(self)
print "that's it"
Cela, cependant, ne fonctionne que le premier init il peut trouver, ce qui est en First
. (2) Peut super()
être utilisé pour exécuter l'initialisation de First
et Second
, et si oui, comment? L'exécution de super(Third, self).__init__(self)
deux fois exécuté en Premier.init() deux fois..
D'ajouter un peu plus de confusion. Que faire si le héritées des classes init() les fonctions de différents arguments. Par exemple, si j'avais quelque chose comme cela:
class First(object):
def __init__(self, x):
print "first"
class Second(object):
def __init__(self, y, z):
print "second"
class Third(First, Second):
def __init__(self, x, y, z):
First.__init__(self, x)
Second.__init__(self, y, z)
print "that's it"
(3) Comment pourrais-je être en mesure de fournir les arguments pertinents pour les différentes héritées des classes de fonctions d'initialisation à l'aide de super()?
Tous les conseils sont les bienvenus!
ps. Depuis que j'ai plusieurs questions, je les ai mis en gras et numéroté..
super(Class, self)
retourne un objet, de sorte que vous ne devriez pas appeler avec.__init__(self)
, mais juste.__init__()
. Vous pouvez les voir dans les réponses, mais l'original de votre premier code renvoie l'exceptionTypeError: __init__() takes exactly 1 argument (2 given)
.
Vous devez vous connecter pour publier un commentaire.
Pour la question 2, vous devez appeler super dans chaque classe:
Pour la question 3, qui ne peut pas être fait, votre méthode doit avoir la même signature. Mais vous pourriez tout simplement ignorer certains paramètres dans le parent de clases ou utiliser des mots clés les arguments.
super
va à l'encontre de Python propreexplicit is better than implicit
, cela dépend de la MRO (coopération dans les les parents!) et mémorise la classe parente des objets dans la première initialisation d'appel qui causent d'autres problèmes si réimportation des modules! Pourquoi est-il ajouté à la langue, bonne question, ressemble à un demi-arsed moche hack.__init__()
? L'initialisation de l'objet. Vous ne savez pas comment initialiser le ensemble de l'objet, bien que, parce que l'héritage multiple peut vous donner des super-classes que vous ne connaissez pas. Donc, vous devez appelersuper()
. Comme pour "mémorise la classe parente des objets dans la première initialisation d'appel", je n'ai aucune idée de quoi vous parlez.1) Il n'y a rien de mal à faire comme ce que u ont fait en 1, si tu veux utiliser les attributs de la classe de base alors u faut appeler la classe de base init() ou même si u r l'aide des méthodes de la classe de base qui utilise les attributs de sa propre classe alors u appeler baseclass init()
2) Vous ne pouvez pas utiliser super pour exécuter l'initialisation à partir de la Première et de la Deuxième parce que python utilise MRO (Méthode de résolution de l'ordre)
voir le code suivant c'est le diamant de la hiérarchie
Il imprime:
MRO de python serait D,B,C,A
si B n'ont pas de méthode init, il va pour C.
3) Vous ne pouvez pas le faire toutes les méthodes doivent avoir la même signature.