Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步初始化python类时向其传递参数_Python_Python 3.x_Async Await_Python Asyncio - Fatal编程技术网

异步初始化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