异步初始化python类时向其传递参数
我在看他们在哪里解释了如何用异步初始化python类时向其传递参数,python,python-3.x,async-await,python-asyncio,Python,Python 3.x,Async Await,Python Asyncio,我在看他们在哪里解释了如何用\uuuuuuwait\uuuuuuuu方法异步初始化一个类。问题是:在等待类的初始化时是否可以传递参数,就像同步初始化时一样 换句话说,我希望能够做到 my_class=await MyClass(my_参数),但我无法以任何方式使其工作 我是否应该退回到像中那样使用经典的\uuuuinit\uuu。您首先创建一个常规类实例,然后等待该实例。这是两个独立的行动 例如,您可以先创建实例,然后单独等待: my_class = MyClass(my_parameter)
\uuuuuuwait\uuuuuuuu
方法异步初始化一个类。问题是:在等待类的初始化时是否可以传递参数,就像同步初始化时一样
换句话说,我希望能够做到
my_class=await MyClass(my_参数)
,但我无法以任何方式使其工作
我是否应该退回到像中那样使用经典的
\uuuuinit\uuu
。您首先创建一个常规类实例,然后等待该实例。这是两个独立的行动
例如,您可以先创建实例,然后单独等待:
my_class = MyClass(my_parameter)
result_from_coroutine = await my_class
或者您可以从中创建一个任务,并让事件循环使用
my_class = MyClass(my_parameter)
task = asyncio.create_task(my_class) # the loop will await the task
# ...
if task.done():
result_from_coroutine = task.result()
\uuuu wait\uuuu
方法是wait
或事件循环用于驱动协同路由的方法。相同的分离适用于协同程序函数(用async def
定义);当您调用它们时,它们也会创建一个新的协同路由对象,您不必立即等待它们。您可以在另一时间对结果使用wait
如果您正在寻找异步实例创建,那么您可以通过将
>>> class Async:
... async def __new__(cls):
... instance = super().__new__(cls)
... return instance
...
>>> Async()
<coroutine object Async.__new__ at 0x103654148>
此时,您可以决定将\uuuu init\uuu
方法也作为一个协同程序
请注意,这实际上与纹理相反。我会把调用依赖协同路由的时间推迟到以后
例如,您可以将参数存储到实例上的类中,并在等待实例时使用这些参数(通过调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
换句话说,我希望能够执行my_class=wait MyClass(my_参数)
,但是我无法以任何方式使其工作
您可以通过实现\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
使MyClass
可等待:
class MyClass:
def __init__(self, delay):
self.delay = delay
async def __await__(self):
await asyncio.sleep(self.delay)
asyncio.run(MyClass(2)) # sleeps 2 seconds
链接答案中的代码也做了类似的事情,但它更复杂,因为它假设\uuuu init\uuuu
本身需要等待
。如果情况并非如此,并且您的\uuuu init\uuuu
实际上是微不足道的,但是您希望返回的实例是可等待的,那么您不需要增加拆分初始化的复杂性
注意:尽管是,asyncio.run()
仍然标记为临时。在上面的示例中,它可以很容易地替换为run\u直到\u完成
。我之所以进行异步初始化,是因为我正在等待一些方法,这些方法需要在创建类时立即运行,但因为它们是私有方法,所以我不想将它们称为“外部”类本身的。@FedericoCrazza:您不能异步创建实例。@FedericoCrazza:这是因为创建实例的过程不是由\uuuu init\uuuu
处理的,这只是在创建实例后调用的一个钩子。这很有趣,但我同意,我应该稍后打电话给等待者。我会玩一下这个。感谢you@FedericoCorazza对于被拒绝的编辑,我很抱歉,我不知道它是由提出问题的同一个人完成的。我现在修改了答案,提到了asyncio.run
的临时状态。
class MyClass:
def __init__(self, delay):
self.delay = delay
async def __await__(self):
await asyncio.sleep(self.delay)
asyncio.run(MyClass(2)) # sleeps 2 seconds