如何在继承类中扩展父类方法生成的metrics_list列表?
问题分析与解决方案
你的错误原因很明确:在尝试扩展metrics_list的时候,这个属性还没有被创建出来。
看一下你的代码逻辑:
BaseClass的__init__里什么都没做,没有调用create_metrics方法,所以父类初始化后,实例上并没有metrics_list这个属性。- 子类
Antifraud的__init__先调用super().__init__(),这时候实例还是没有metrics_list,紧接着你就调用self.metrics_list.extend(['f1']),自然会抛出AttributeError。
当然可以实现你的需求,这里提供几种可行的方案:
方案1:在父类的__init__中调用create_metrics
这是最合理的做法,因为metrics_list是实例的核心属性,父类应该在初始化时就完成它的创建:
class BaseClass: def __init__(self): self.create_metrics() # 初始化时自动创建metrics_list def create_metrics(self): self.metrics_list = ['score', 'precision', 'recall'] class Antifraud(BaseClass): def __init__(self): super().__init__() # 父类初始化后,metrics_list已经存在 self.metrics_list.extend(['f1']) a = Antifraud() print(a.metrics_list) # 输出:['score', 'precision', 'recall', 'f1']
方案2:在子类__init__中手动调用父类的create_metrics
如果不能修改父类的代码,你可以在子类初始化时,先主动调用父类的create_metrics方法来创建属性:
class BaseClass: def __init__(self): pass def create_metrics(self): self.metrics_list = ['score', 'precision', 'recall'] class Antifraud(BaseClass): def __init__(self): super().__init__() self.create_metrics() # 手动触发父类的方法创建metrics_list self.metrics_list.extend(['f1']) a = Antifraud() print(a.metrics_list)
方案3:重写子类的create_metrics方法
更符合面向对象设计思路的方式是,把扩展metrics_list的逻辑放在create_metrics方法里,子类重写这个方法来扩展父类的行为:
class BaseClass: def __init__(self): self.create_metrics() def create_metrics(self): self.metrics_list = ['score', 'precision', 'recall'] class Antifraud(BaseClass): def create_metrics(self): super().create_metrics() # 先调用父类方法初始化基础列表 self.metrics_list.append('f1') # 或者用extend添加多个元素 a = Antifraud() print(a.metrics_list)
这三种方案都能实现你的需求,你可以根据实际场景选择:如果能修改父类,方案1和3更推荐;如果父类不能修改,就用方案2。
内容的提问来源于stack exchange,提问作者Javier Lopez Tomas
相关产品推荐
相关产品推荐

