Python: Hériter de la superclasse __init__
J'ai une classe de base avec beaucoup de __init__
arguments:
def BaseClass(object):
def __init__(self, a, b, c, d, e, f, ...):
self._a=a+b
self._b=b if b else a
...
Toutes les classes héritant doit s'exécuter __init__
méthode de la classe de base.
Je peux écrire un __init__()
méthode dans chacune des classes héritant qui ferait appel de la super-classe __init__
, mais ce serait une grave duplication de code:
def A(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, b, c, d, e, f, ...)
def B(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, b, c, d, e, f, ...)
def C(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, b, c, d, e, f, ...)
...
Ce qui est le plus Pythonic automatique d'appel de la super-classe __init__
?
Vous devez vous connecter pour publier un commentaire.
Pensez à utiliser *args et **kw si elle contribue à la résolution de votre variable cauchemar.
super().__init__(...)
fonctionne.BaseClass.__init__
à l'intérieur deBaseClass(): __init__:
vous obtenez une récursion infinie.super
appelle la classe parent.Vous devez l'écrire explicitement, mais d'un autre côté, si vous avez beaucoup d'arguments, vous devriez probablement utiliser *args de positionnement args et **kwargs pour le mot-clé args.
Une autre technique que vous pouvez utiliser est de minimiser le code dans init et puis à la fin de init fonction, appeler une autre fonction personnalisée. Puis, dans la sous-classe, il vous suffit de remplacer la fonction personnalisée
preinit()
etpostinit()
crochets. La valeur de retour depreinit()
peut être enregistré dans une variable locale dans__init__
et passé àpostinit()
, ce qui est pratique parfois.__init__
processus. Je pense que ce genre depostinit()
crochet devrait fonctionner parfaitement.Si les classes dérivées ne pas mettre en œuvre quelque chose au-delà de ce que la classe de base
__init__()
déjà fait, omettez simplement les classes dérivées__init__()
méthodes de la classe de base__init__()
est alors appelé automatiquement.Si, otoh, que, vos classes dérivées ajouter un peu de travail supplémentaire dans leur
__init__()
, et vous n'en voulez pas à appeler explicitement leur classe de base__init__()
, vous pouvez le faire:Depuis
__new__()
est toujours appelé automatiquement, aucun travail supplémentaire n'est nécessaire dans les classes dérivées.Sauf si vous faites quelque chose d'utile dans la sous-classe
__init__()
méthodes, vous n'avez pas à le remplacer.Peut-être une meilleure mise en œuvre pour que votre affaire est à l'aide de **kwargs combinée avec de nouveaux arguments supplémentaires dans votre classe dérivée comme dans:
Par cette méthode, vous éviter la duplication de code, mais de préserver l'implicite plus d'arguments dans votre classe dérivée.
En 2.6 et la version inférieure à hériter d'init de la classe de base, il n'y a pas de super fonction, Vous pouvez hériter ci-dessous moyen:
L'ajout d'un Pythonic mise en œuvre. En supposant que vous voulez tous les attributs transmis, vous pouvez utiliser le code ci-dessous. (Peut aussi garder/supprimer des kwargs clés si vous voulez un sous-ensemble).