Итак, я пытаюсь понять суть A и B. Я предполагаю, что, возможно, вы хотите смешать поведение суперкласса и иногда иметь локальное поведение. Итак, предположим, что A просто смешивает поведение, а B имеет локальное поведение и состояние.
Если вам не нужно ваше собственное состояние, вам, вероятно, не нужен __init__
. Поэтому для A
и C
просто опустите __init__
.
class SomethingElse(object):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
class D(SomethingElse):
def __init__(self, value, *args, **kwargs):
super(D, self).__init__(*args, **kwargs)
self.value = value
def function(self):
return self.value
def other_method(self):
return self.__dict__
class C(object):
#def __init__(self):
# super(C, self).__init__()
def function(self):
return self.value*2
class B(C, D):
def __init__(self, value, bstate, *args, **kwargs):
super(B, self).__init__(value, *args, **kwargs)
self.bstate = bstate
def __repr__(self):
return (self.__class__.__name__ + ' ' +
self.bstate + ' ' + str(self.other_method()))
class A(C, D):
pass
a = A(3)
b = B(21, 'extra')
a.function()
6
b.function()
42
repr(a)
'<xx.A object at 0x107cf5e10>'
repr(b)
"B extra {'args': (), 'bstate': 'extra', 'value': 21, 'kwargs': {}}"
Я сохранил синтаксис python2, предполагая, что вы все еще можете его использовать, но, как указывает другой ответ, python3 упрощает синтаксис super()
, и вы действительно должны использовать python3 сейчас.
Если вы поменяете местами C и D, вы измените порядок разрешения метода python, и это действительно изменит метод, в который разрешается вызов функции A.function.