如何在构造函数或类体中用await
定义类?
例如我想要的:
import asyncio
# some code
class Foo(object):
async def __init__(self, settings):
self.settings = settings
self.pool = await create_pool(dsn)
foo = Foo(settings)
# it raises:
# TypeError: __init__() should return None, not 'coroutine'
或具有类body属性的示例:
class Foo(object):
self.pool = await create_pool(dsn) # Sure it raises syntax Error
def __init__(self, settings):
self.settings = settings
foo = Foo(settings)
我的解决方案(但我希望看到更优雅的方式)
class Foo(object):
def __init__(self, settings):
self.settings = settings
async def init(self):
self.pool = await create_pool(dsn)
foo = Foo(settings)
await foo.init()
我推荐一种单独的工厂方法。这是安全和直接的。但是,如果坚持使用
async
版本的__init__()
,下面是一个示例:用法:
输出:
说明:
类构造必须返回一个
coroutine
对象,而不是它自己的实例。另一种方式,为了搞笑:
大多数magic方法不是设计用来处理
async def
/await
-通常,您应该只在专用异步magic方法中使用__aiter__
、__anext__
、__aenter__
和__aexit__
。在其他magic方法中使用它可能根本不起作用(就像__init__
那样),或者将强制您始终在异步上下文中使用magic方法调用的任何触发器。现有的} ):
asyncio
库倾向于用以下两种方法之一来处理这个问题:首先,我看到了使用的工厂模式(例如^{其他库使用创建对象的顶级协同程序函数,而不是工厂方法:
要在
__init__
中调用aiopg
中的create_pool
函数实际上使用的正是这个模式。这至少解决了
__init__
问题。我还没有见过可以在野外进行异步调用的类变量,所以我不知道是否出现了任何已经建立良好的模式。相关问题 更多 >
编程相关推荐