<p>大多数magic方法不是设计用来处理<code>async def</code>/<code>await</code>-通常,您应该只在专用异步magic方法中使用<code>__aiter__</code>、<code>__anext__</code>、<code>__aenter__</code>和<code>__aexit__</code>。在其他magic方法中使用它可能根本不起作用(就像<code>__init__</code>那样),或者将强制您始终在异步上下文中使用magic方法调用的任何触发器。</p>
<p>现有的<code>asyncio</code>库倾向于用以下两种方法之一来处理这个问题:首先,我看到了使用的工厂模式(例如<a href="https://github.com/jonathanslenders/asyncio-redis/blob/master/asyncio_redis/pool.py#L27">^{<cd10>}</a>):</p>
<pre><code>import asyncio
dsn = "..."
class Foo(object):
@classmethod
async def create(cls, settings):
self = Foo()
self.settings = settings
self.pool = await create_pool(dsn)
return self
async def main(settings):
settings = "..."
foo = await Foo.create(settings)
</code></pre>
<p>其他库使用创建对象的顶级协同程序函数,而不是工厂方法:</p>
<pre><code>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)
</code></pre>
<p>要在<code>__init__</code>中调用<code>aiopg</code>中的<code>create_pool</code>函数实际上使用的正是这个模式。</p>
<p>这至少解决了<code>__init__</code>问题。我还没有见过可以在野外进行异步调用的类变量,所以我不知道是否出现了任何已经建立良好的模式。</p>