如何在基类中调用被子类重载的静态方法?
问题根源
你当前使用的@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
相关产品推荐
相关产品推荐

