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.
相关产品推荐
相关产品推荐

