You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何子类化协程?实现MyCoro类与协程行为一致

实现自定义协程类的方案

要让MyCoro类的实例拥有和原生协程完全一致的行为,无需继承特定的Coroutine基类(Python标准库中没有直接可用的、能通过super().__init__直接封装协程的基类),只需让类的实例成为可等待对象即可,具体实现如下:

代码实现

import asyncio

class MyCoro:
    def __init__(self, text):
        async def coro():
            await asyncio.sleep(5)
            print(text)
        # 初始化时创建内部协程对象
        self._inner_coro = coro()
    
    def __await__(self):
        # 代理内部协程的await迭代器
        return self._inner_coro.__await__()

验证使用

你可以像原生协程一样直接将MyCoro实例传给asyncio.create_task:

async def main():
    # 与原生协程用法完全一致
    asyncio.create_task(MyCoro("Hello!"))
    await asyncio.sleep(6)  # 等待协程执行完成

asyncio.run(main())

原理说明

  • asyncio.create_task接受可等待对象作为参数,包括原生协程、Task、Future,以及实现了__await__方法的自定义对象。
  • 我们在MyCoro中实现__await__方法,直接返回内部协程对象的__await__迭代器,相当于让MyCoro实例完全复用原生协程的执行逻辑,因此行为和原生协程完全一致。

内容的提问来源于stack exchange,提问作者Max Smirnov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:30:09