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

classy-fastapi中子类无法继承父类路由?是否为预期行为?

classy_fastapi父类路由无法被子类继承的问题解答

这是预期行为吗?

是的,这是classy_fastapi的预期行为。该库的路由装饰器(如@get)会在类定义阶段将路由绑定到当前类的routes属性中,子类继承时不会自动合并父类的路由集合,需要手动处理路由继承逻辑。

解决思路

方法1:手动合并父类路由

在子类的__init__方法中,主动将父类的路由添加到子类的路由列表中:

from classy_fastapi import Routable, get

class A(Routable):
    def __init__(self):
        super().__init__()

    @get('/user')
    def get_user(self):
        return "some user"

class B(A):
    def __init__(self):
        super().__init__()
        # 合并父类路由到子类
        self.routes.extend(A.routes)

    @get('/company')
    def get_company(self):
        return "company"

方法2:自定义基类实现自动路由继承

若需要多个子类都自动继承父类路由,可以封装一个通用基类,在初始化时自动遍历并合并所有父类的路由:

from classy_fastapi import Routable

class AutoInheritRoutable(Routable):
    def __init__(self):
        super().__init__()
        # 遍历所有父类,合并路由(排除Routable本身)
        for base in self.__class__.__bases__:
            if base != Routable and issubclass(base, Routable):
                self.routes.extend(base.routes)

# 使用自定义基类
class A(AutoInheritRoutable):
    def __init__(self):
        super().__init__()

    @get('/user')
    def get_user(self):
        return "some user"

class B(A):
    def __init__(self):
        super().__init__()

    @get('/company')
    def get_company(self):
        return "company"

关键注意点

  • 原示例代码中方法缺少self参数,这会导致路由无法正常工作,必须补上
  • 若父类与子类存在同名路由,子类路由会覆盖父类路由,符合Python继承的优先级规则

内容的提问来源于stack exchange,提问作者U.R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:55:19