【问题标题】:Abstract Method using Implementation level method使用实现级方法的抽象方法
【发布时间】:2021-09-16 08:22:55
【问题描述】:

我正在我的电子商务网站中实现一些用于调整价格的类:每个类代表一个不同的定价调整策略,并且属于一个 AbstractBaseClass,它规定了两种方法: transform_pricetransform_array

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_array 只是transform_price 方法的列表理解(当然,这是特定于实现的),我希望有某种方法可以完全抽象此方法,使其仍然执行具体实现方法transform_price

例如,我希望能够定义一个 PricingModel:

class PriceRatio(PricingModel):
    def __init__(self, **kwargs):
        ...
    
    def transform_price(self, price):
        ...
        return new_price
        
    # Note the abscence of a transform_price_array method!

虽然仍然可以访问抽象类中定义的 transform_price_array 方法:

_ = PriceRatio.transform_price_array([1,2,3,..])

【问题讨论】:

    标签: python oop abstract-class abstract-base-class


    【解决方案1】:

    原来这个行为是默认启用的。

    删除了我对 transform_price_array 方法的所有实现,只留下抽象方法,我的所有测试仍然通过!

    【讨论】:

    • 是的,因为您从未将 transform_price_array 声明为抽象方法。不是你不能调用抽象方法,而是你不能实例化一个没有覆盖所有继承的抽象方法的类。
    • 是的,你是对的。我的想法是基于将 ABC 视为一种父类的错误观点,在这种范式中,实例访问父类的方法并反过来访问特定实例的方法是没有意义的。我现在开始将 ABC 理解为更像是一个“模板”类,在这种情况下,上面的描述非常有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2013-05-30
    相关资源
    最近更新 更多