Une métaclasse est une solution possible, mais quelque peu complexe. super
peut le faire très simplement (avec de nouvelles classes de style bien sûr: il n'y a aucune raison d'utiliser des classes existantes dans le nouveau code!): Vous avez besoin du try/sauf
class B(object):
def fn(self):
print 'B'
try: super(B, self).fn()
except AttributeError: pass
class A(object):
def fn(self):
print 'A'
try: super(A, self).fn()
except AttributeError: pass
class C(A, B): pass
c = C()
c.fn()
soutenir un ordre d'héritage unique ou multiple (puisque à un certain point, il n'y aura plus de base le long de l'ordre de résolution de la méthode, MRO, en définissant une méthode nommée fn
, vous devez attraper et ignorer le résultat AttributeError
). Mais comme vous le voyez, différemment de ce que vous semblez penser en fonction de votre commentaire à une réponse différente, vous n'avez pas nécessairement besoin de surcharger fn
dans votre classe leafmost sauf si vous avez besoin de faire quelque chose de spécifique à cette classe dans un tel override - super
fonctionne bien sur les méthodes purement héritées (pas surchargées), aussi!
En fait, j'aime mieux la solution de THC4k que la mienne. : D Avec la qualification de l'OP qu'il préfère éviter 'super()', cela semble mieux correspondre. Cependant, AFAIK, les métaclasses ne fonctionnent qu'avec des classes de style nouveau. +1 aux sentiments de nikow et d'extraneon, cependant. –