Метакласс - возможное решение, но несколько сложное. 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
отлично работает на чисто унаследованных (не переопределенных) методах!
Я действительно предпочитаю решение THC4k лучше, чем мое. : D С квалификацией OP, что он предпочел бы избегать 'super()', похоже, это лучше подходит. Однако, AFAIK, метаклассы работают только с классами нового стиля. +1 к обоим никоу и чувствам экстранеона. –