Comment remplacer constructeur de Python classe avec de nombreux arguments?
Dire, j'ai une classe Foo, l'extension de la classe Bar. Et je veux légèrement remplacer Foo consructor. Et je ne veux même pas savoir ce que signarure de la Barre des constructeurs est. Est-il un moyen de faire cela?
Si vous ne comprenez pas, je veux dire les éléments suivants:
class Bar:
def __init__ (self, arg1=None, arg2=None, ... argN=None):
....
class Foo (Bar):
#Here i just want add additional parameter to constructor, but don't want to know anything about Bar's other parameters (arg1, arg2..., argN)
def __init__ (self, my_new_arg=None, ??? )
self.new_arg = my_new_arg
Bar.__init__(self, ??? )
Est-il un moyen de mettre quelque chose de court et élégant au lieu de ??? dans ce code?
(Peut-être que certaines variations de args/kwargs)
- Si
Foo
devrait en savons si peu surBar
, pourquoi est-il découlant deBar
? Je veux dire, la technique est utile de gain de temps, mais...
Vous devez vous connecter pour publier un commentaire.
De sortie:
def __init__(self, c, d, *args, **kwargs): super(*args, **kwargs)
. À moins que vous soyez aux prises avec l'héritage multiple, python sait déjà la seule super-classe, il devrait être en utilisant.super().__init__(*args, **kwargs)
?La
*args, **kwds
solution présentée par @Acorn est un bon début (bien que je conteste avec la*args
partie de la réponse). Cette approche est présentée avec un certain nombre de précisions dans l'article, Python Super Considéré Super.La
*args
partie est déconseillé, car il ne permet pas d'insérer de nouvelles classes dans la hiérarchie et il s'oppose à des sous-classes de l'utilisation de l'héritage multiple avec d'autres classes qui peuvent avoir incompatible arguments de position. Le**kwds
approche fonctionne beaucoup mieux, car il n'a pas d'appliquer une commande particulière de la chaîne d'appel.Noter également, vous pouvez utiliser les arguments nommés pour séparer et retirer la méthode actuelle est nommé arguments du reste du mot-clé arguments avant qu'ils arrivent à remonter la chaîne:
Avoir chaque méthode bande-les arguments dont elle a besoin est important, car une méthode parent comme objet.__init__ ne s'attend à aucun des arguments à tous.
Une dernière remarque, si vous allez utiliser super, assurez-vous que votre plus haute classe est un style nouveau (c'est à dire qu'il hérite de objet ou certains autres builtin type).