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

如何在基类中调用被子类重载的静态方法?

问题根源

你当前使用的@staticmethod没有接收调用类的隐式参数,写死BaseClass._get_all()只会调用基类的抛出异常实现,直接写_get_all()会尝试访问全局作用域的同名函数,自然会报错。

解决方案:改用类方法实现

类方法会自动接收实际发起调用的类作为第一个参数cls,完美适配继承场景下的重载调用,修改后代码如下:

########################################################################
class BaseClass:
  @classmethod
  def _get_all(cls):
    raise Exception("Must be overloaded")

  @classmethod
  def _get_all_odd(cls):
    result = [sh for sh in cls._get_all() if sh%2 == 1]
    return result

##################################################################
class Shape(BaseClass):
  __all_shapes = [1, 2, 3]
  @classmethod
  def _get_all(cls):
    return cls.__all_shapes

print(Shape._get_all_odd()) # 输出结果为 [1, 3]

方案说明

  • 用@classmethod替换@staticmethod,方法第一个参数固定为cls,指代当前发起调用的类
  • 基类_get_all_odd中通过cls._get_all()调用,会自动按照继承链查找对应子类的重载实现
  • 子类的__all_shapes也可以通过cls访问,无需写死Shape类名,后续新增其他继承自BaseClass的子类时不需要修改基类逻辑

内容的提问来源于stack exchange,提问作者Yulia V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:51:04