J'ai une classe de base Base
et deux sous-classes Foo
et Bar
. Dans Base
je définis une fonction avec un argument optionnel. Cet argument est donné ou récupéré au moment de l'exécution (pas au moment de la définition). L'argument est toujours récupéré de la même manière, ce qui conduit à des sous-classes ayant une ligne de code standard (bien sûr, c'est une ligne, mais c'est juste un exemple). Normalement, cela ressemblerait à ceci:Valeur par défaut de l'argument de la méthode surchargée (empêchant le passe-partout)
class Base(object):
def greet(self, name=None):
pass
class Foo(Base):
def greet(self, name=None):
name = name or get_name_at_runtime()
print('Hello {name} this is Foo.'.format(name=name))
class Bar(Base):
def greet(self, name=None):
name = name or get_name_at_runtime()
print('Hello {name} this is Bar.'.format(name=name))
Maintenant, je suis venu avec un hack qui permet de résoudre ce problème, mais je ne trouve pas que ce soit une solution solide. La solution implique la définition d'une méthode privée qui enveloppe la méthode substituée et lui fournit la valeur correcte. Les deux méthodes sont commutées dans le __init__
afin d'appeler/redéfinissant la méthode se sent « normal »:
class Base(object):
def __init__(self):
self.greet, self.__greet = self.__greet, self.greet
def greet(self, name):
pass
def __greet(self, name=None):
self.__greet(name or get_name_at_runtime())
class Foo(Base):
def greet(self, name):
print('Hello {name} this is Foo.'.format(name=name))
class Bar(Base):
def greet(self, name):
print('Hello {name} this is Bar.'.format(name=name))
La « solution » je suis venu avec pose le problème que ce n'est pas clair que le nom est facultatif, car il semble que ce doesn n'a pas de valeur par défaut.
Dans certains cas, Base
est une classe de base abstraite et, dans certains cas, elle ne l'est pas, donc je suis à la recherche d'une solution qui supporte les deux.
Pourquoi pas le métacl asses solution? –