Toutes les classes dérivées d'une certaine classe de base doivent définir un attribut appelé "path". Au sens de la frappe de canard je pouvais compter sur une définition dans les sous-classes:Passer un paramètre au constructeur de classe de base ou utiliser une variable d'instance?
class Base:
pass # no "path" variable here
def Sub(Base):
def __init__(self):
self.path = "something/"
Une autre possibilité serait d'utiliser le constructeur de la classe de base:
class Base:
def __init__(self, path):
self.path = path
def Sub(Base):
def __init__(self):
super().__init__("something/")
J'utilise Python 3.1.
Que préférez-vous et pourquoi? Y a-t-il un meilleur moyen?
Il n'y a rien de fragile à propos de 'super()'. La fragilité est dans la syntaxe 2.x, qui est fixée dans 3.x (que l'OP utilise, comme indiqué par l'appel 'super()'), et l'héritage multiple en général. Il n'y a aucune raison d'appeler la méthode baseclass directement dans Python 3.x, la syntaxe 'super() .__ init (...)' n'est jamais pire et souvent meilleure. –
à en juger par l'utilisation de 'super', je suppose que deamon utilise py3k – SilentGhost
@Thomas Wouters: comment utiliseriez-vous super si vous avez plusieurs classes d'héritage et de base avec des signatures constructeurs différentes? Passer tous les arguments des classes dérivées à toutes les classes de base ressemble à un hack sale, s'appuyer sur des paramètres nommés et laisser les classes de base trier ce dont ils ont besoin n'est pas beaucoup plus agréable. – kriss