Вызов метода __call__ из обоих родительских классов

#python-3.x #class #oop

#python-3.x #класс #ооп

Вопрос:

У меня есть классы:

 class C1():
    def __call__(self,name='1'):
        self.name=name
        print(self.name)

class C2():
    def __call__(self,name='2'):
        self.name=name
        print(self.name)

class C3(C1, C2):
    def __call__(self,name='=>35'):
        super().__call__()
        self.name=name
        print(self.name)
  

Результат:

 1
=>35
  

Но чего я ожидаю:

 1
2
=>35
  

Как вызвать этот метод из обоих родительских классов?

Ответ №1:

super() просто получает следующий в порядке разрешения метода или «mro». Он волшебным образом не вызывает несколько методов одновременно.

Обычно вы размещаете super() вызов в каждом классе. Таким образом, он всегда разрешается сам. В этом случае последний в строке вызовет AttributeError .

Однако вы можете обойти это, проверив, имеет ли ваш метод метод, который вы пытаетесь вызвать в своем родительском классе.

 class C1():
    def __call__(self,name='1'):
        self.name=name
        print(self.name)
        # I'm sure ther is a more pythonic way to do this
        # but this just checks if your super class has a
        # call method before calling it
        # you could just try catch the AttributeError as well
        # either way, your IDE will probably complain about this.
        super_class = super()
        if hasattr(super_class, '__call__'):
            super_class.__call__()

class C2():
    def __call__(self,name='2'):
        self.name=name
        print(self.name)
        super_class = super()
        if hasattr(super_class, '__call__'):
            super_class.__call__()

class C3(C1, C2):
    def __call__(self,name='=>35'):
        super().__call__()
        self.name=name
        print(self.name)

foo = C3()
foo()