Метакласс является возможным решением, но несколько сложным. super
может сделать это очень просто (конечно, с новыми классами стилей: нет причин использовать устаревшие классы в новом коде!):
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()
Вам нужно попробовать / исключить, чтобы поддерживать любой порядок одиночного или множественного наследования (поскольку в некоторый момент не будет больше базы вдоль порядка-разрешения-метода, MRO, определяющего метод с именем fn
, вам необходимо поймать и игнорировать полученное AttributeError
). Но, как вы видите, в отличие от того, что вы думаете на основании вашего комментария к другому ответу, вам не обязательно переопределять fn
в вашем самом крайнем классе, если вам не нужно делать что-то определенное для этого класса в таком переопределении - super
прекрасно работает и с чисто унаследованными (не переопределенными) методами!