Я хотел бы абстрагировать один из моих классов API, чтобы решить следующую проблему. Допустим, у меня есть базовый класс вроде:
class AbstractAPI(ABC):
@abstractmethod
def create(self):
pass
@abstractmethod
def delete(self):
pass
И конкретный класс:
class API(AbstractAPI):
def create(self):
print("create")
def delete(self):
print("delete")
Когда приходят запросы, у меня нет доступа к моему экземпляру API. Как из-за многопоточности, так и во избежание циклического импорта. На данный момент я знаю, какой метод я хотел бы вызвать позже. Поэтому мой план состоял в том, чтобы поместить указатель функции AbstractAPI в очередь и ждать, пока у меня не появится доступ к экземпляру API.
function_pointer=AbstractAPI.create
# later on ...
function_pointer(ConcreteAPIInstance)
В этот момент вызовите указатель функции на экземпляр API, ба-да-бим, ба-да-бум. Это не работает. Конечно, вызов указателя функции AbstractAPI на экземпляр API вызывает пустой метод AbstractAPI. Ничего не происходит. Есть ли способ заставить это работать?
как это будет работать? можете ли вы привести пример кода?
Что-то вроде function_pointer = lambda api: api.create()
. Тогда function_pointer(ConcreteAPIInstance)
.
В вашем вопросе есть парадокс: вы говорите, что у вас нет доступа к вашему экземпляру API, но вы хотите вызвать его методы. Или я не понимаю того, чего вы пытаетесь достичь. Что такое ConcreteAPIInstance
, у вас нет доступа к вашему экземпляру API. А если у вас есть доступ к ConcreteAPIInstance
и вы знаете, что хотите вызвать create()
, то что плохого в ConcreteAPIInstance.create()
?
Ничего парадоксального в этом нет. Решение о том, какой из методов я хочу вызвать, принимается в другой момент времени (и поток), чем тот, когда я его фактически вызываю.
Вместо прямой ссылки на метод абстрактного класса function_pointer=AbstractAPI.create
вы можете написать функцию, которая вызывает именованный метод create()
для данного объекта.
function_pointer = lambda api : api.create()
или
def function_pointer(api):
return api.create()
Один из подходов — использовать operator.methodcaller для поиска именованного метода для данного объекта во время вызова:
from abc import ABC, abstractmethod
from operator import methodcaller
class AbstractAPI(ABC):
@abstractmethod
def create(self):
pass
class API(AbstractAPI):
def create(self):
print("create")
function_pointer=methodcaller('create')
function_pointer(API())
Это выводит:
create
Как насчет лямбда-функции?