【发布时间】:2018-11-01 12:39:18
【问题描述】:
在给定基类的方法的情况下,有没有一种方法可以提取实例化了哪个子类?
我知道这个问题有点复杂,所以举个例子:
from functools import wraps
def my_wrapper(fn_to_wrap):
@wraps(fn_to_wrap)
async def async_wrapper(*args, **kwargs):
await do_some_async_stuff()
print('Did some async stuff')
return fn_to_wrap(*args, **kwargs)
@wraps(fn_to_wrap)
def sync_wrapper(*args, **kwargs):
do some_sync_stuff()
print('Did some sync stuff')
return fn_to_wrap(*args, **kwargs)
# <my_problem>
if fn_to_wrap belongs_to(SyncClass):
return sync_wrapper
else:
return async_wrapper
# </my_problem>
class BaseClass:
@my_wrapper
def fn_to_wrap(self):
return 'Finally a return a value'
class SyncClass(BaseClass):
def fn_to_call(self):
return self.fn_to_wrap()
class AsyncClass(BaseClass):
async def fn_to_call(self):
return await self.fn_to_wrap()
问题是方法fn_to_wrap属于BaseClass。我的 Sync 和 Async 类继承自哪个。
有什么方法可以让我知道fn_to_wrap 属于 AsyncClass 还是 SyncClass 的实例?
简单地说,我想让我的控制台打印:
>>> my_sync_class = SyncClass()
>>> print(my_sync_class.fn_to_call())
Done some sync stuff
Finally a return value
和
>>> my_async_class = AsyncClass()
# not in a coroutine for brevity
>>> print(await my_async_class.fn_to_call())
Done some async stuff
FInally a return value
那么,您将如何实施</my_problem> 来实现这些结果?
[编辑]
我知道inspect.iscoroutinefunction 和inspect.iscoroutine 的存在。但这些都无济于事,因为包装的方法总是同步的,而包装器是异步任务的。
【问题讨论】:
标签: python python-3.x async-await wrapper python-asyncio