如何在__init__中设置能够await的类或实例属性

如何在构造函数或类体中定义一个具有等待的类?

例如下面的这个代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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'

大多数魔术方法并不适用于异步方式。 应该使用专用的异步魔法方法__aiter____anext____aenter____aexit__。在其他魔法方法在协程定义async/await中使用它将完全不起作用(如__init__的情况)。

第一种解决方法是使用协同函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import asyncio

dsn = "..."

async def create_foo(settings):
foo = Foo(settings)
await foo._init()
return foo

class Foo(object):
def __init__(self, settings):
self.settings = settings

async def _init(self):
self.pool = await create_pool(dsn)

async def main():
settings = "..."
foo = await create_foo(settings)

第二种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import asyncio

dsn = "..."

class Foo(object):
def __init__(self, settings):
self.settings = settings

def __await__(self):
self.pool = yield from create_pool(dsn)

async def main():
settings = "..."
foo = await Foo(settings)
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!