擅长:python、mysql、java
<p>我推荐一种单独的工厂方法。这是安全和直接的。但是,如果坚持使用<code>async</code>版本的<code>__init__()</code>,下面是一个示例:</p>
<pre><code>def asyncinit(cls):
__new__ = cls.__new__
async def init(obj, *arg, **kwarg):
await obj.__init__(*arg, **kwarg)
return obj
def new(cls, *arg, **kwarg):
obj = __new__(cls, *arg, **kwarg)
coro = init(obj, *arg, **kwarg)
#coro.__init__ = lambda *_1, **_2: None
return coro
cls.__new__ = new
return cls
</code></pre>
<p><strong>用法:</strong></p>
<pre><code>@asyncinit
class Foo(object):
def __new__(cls):
'''Do nothing. Just for test purpose.'''
print(cls)
return super().__new__(cls)
async def __init__(self):
self.initialized = True
</code></pre>
<p/><p/>
<pre><code>async def f():
print((await Foo()).initialized)
loop = asyncio.get_event_loop()
loop.run_until_complete(f())
</code></pre>
<p><strong>输出:</strong></p>
<pre><code><class '__main__.Foo'>
True
</code></pre>
<p><strong>说明:</strong></p>
<p>类构造必须返回一个<code>coroutine</code>对象,而不是它自己的实例。</p>