Вы можете просто использовать сам объект связанного метода:
tasks = [a.request for a in self.types["social"]]
# ^^^^^^^^^
grabbers = executeChainResults(tasks, [(query, 0)] * len(tasks))
# ^^^^^^^^^^^^^^^^^^^^^^^^^
Если вы настаиваете на вызове ваших методов через базовый класс, вы также можете сделать это следующим образом:
from abc import ABCMeta
from functools import wraps
def virtualmethod(method):
method.__isabstractmethod__ = True
@wraps(method)
def wrapper(self, *args, **kwargs):
return getattr(self, method.__name__)(*args, **kwargs)
return wrapper
class IBase(object):
__metaclass__ = ABCMeta
@virtualmethod
def my_method(self, x, y):
pass
class AddImpl(IBase):
def my_method(self, x, y):
return x + y
class MulImpl(IBase):
def my_method(self, x, y):
return x * y
items = [AddImpl(), MulImpl()]
for each in items:
print IBase.my_method(each, 3, 4)
b = IBase() # <-- crash
Результат:
7
12
Traceback (most recent call last):
File "testvirtual.py", line 30, in <module>
b = IBase()
TypeError: Can't instantiate abstract class IBase with abstract methods my_method
Python не поддерживает интерфейсы, как, например, Java.Но с помощью модуля abc
вы можете гарантировать, что определенные методы должны быть реализованы в подклассах.Обычно вы делаете это с помощью декоратора abc.abstractmethod()
, но вы все равно не можете вызвать метод подклассов через базовый класс, как вы и предполагали.У меня когда-то был похожий вопрос, и у меня была идея декоратора virtualmethod()
.Это довольно просто.По сути, он делает то же самое, что и abc.abstratmethod()
, но также перенаправляет вызов метода подклассов.Особенности модуля abc
можно найти в документах и в PEP3119 .
Кстати: я предполагаю, что вы используете Python> = 2.6.