如何在Python抽象基类中实现复用子类抽象方法的公共方法?
实现方案
你的基类设计已经符合「子类无需重复实现transform_price_array」的核心逻辑,问题出在调用方式和方法类型不匹配,可根据业务场景选择以下两种实现:
方案1:实例调用(推荐,适配带参数的定价策略)
绝大多数定价策略都会包含可调参数(比如折扣比例、满减阈值等),这种场景下保持现有基类的实例方法设计即可,仅需修正调用方式为先实例化子类再调用方法:
import abc class PricingModel(abc.ABC): @abc.abstractmethod def transform_price(self, price): ... def transform_price_array(self, price_array): return [self.transform_price(price) for price in price_array] # 子类实现,无需重写transform_price_array class PriceRatio(PricingModel): def __init__(self, ratio=0.8): # 定价参数在实例化时传入,支持同策略多参数并行使用 self.ratio = ratio def transform_price(self, price): return round(price * self.ratio, 2) # 调用示例 discount_calculator = PriceRatio(ratio=0.75) result = discount_calculator.transform_price_array([100, 200, 300]) # 输出结果:[75.0, 150.0, 225.0]
方案2:类直接调用(适配无参数的简单定价策略)
如果你的定价策略不需要自定义参数,想要直接通过类名调用方法,只需要把基类方法调整为类方法+静态抽象方法即可:
import abc class PricingModel(abc.ABC): @staticmethod @abc.abstractmethod def transform_price(price): ... @classmethod def transform_price_array(cls, price_array): return [cls.transform_price(price) for price in price_array] # 子类实现,无需重写transform_price_array class PriceRatio(PricingModel): # 固定参数可定义为类变量 RATIO = 0.8 @staticmethod def transform_price(price): return round(price * PriceRatio.RATIO, 2) # 调用示例,完全匹配你的需求写法 result = PriceRatio.transform_price_array([100, 200, 300]) # 输出结果:[80.0, 160.0, 240.0]
内容的提问来源于stack exchange,提问作者Joe Boyle
相关产品推荐
相关产品推荐

