#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()