Python类继承场景下如何规范向基类传递变量数据
最优实现方案
你当前使用的super().write_data(self.sample())写法冗余的核心原因,是把基类本该自己负责的属性初始化逻辑,拆分到了子类中手动调用,既增加了子类的重复代码量,也容易出现漏写调用导致data为空的bug。
最简洁规范的实现方式是采用模板方法设计,将采样逻辑定义为基类预留的可重写接口,基类在自身初始化流程中直接调用该方法获取采样数据,子类只需要专注实现自身的采样规则即可,不需要手动传递数据。
优化点说明
- 移除冗余的
write_data方法,避免信号数据被外部意外篡改 - 所有通用初始化逻辑收敛在基类,子类无需重复编写数据传递相关代码
- 基类默认的
sample方法抛出未实现异常,强制子类必须实现对应采样逻辑,从代码层面避免漏写逻辑的问题 - 后续新增信号类型时,仅需重写
sample方法即可复用基类所有通用能力(绘图、积分等),符合开闭原则
优化后完整代码
# -*- coding: utf-8 -*- """ Created on Thu Jun 23 14:13:14 2022 @author: ilja """ from matplotlib import pyplot as plt import math import numpy as np class Signal: def __init__(self, length): self.length = length # 基类初始化时直接调用子类实现的采样方法获取数据 self.data = self.sample() def sample(self): # 基类预留采样接口,子类必须重写该方法 raise NotImplementedError("具体信号类必须实现sample采样方法") def plot(self): plt.figure(1) x = list(range(self.length)) plt.plot(x, self.data) plt.show() def integrate(self): # TODO pass class Harmonic(Signal): def __init__(self, periods, amplitude, frequency): super().__init__(int(2*math.pi*periods)) self.amplitude = amplitude self.frequency = frequency def sample(self): return [self.amplitude * math.sin(i*self.frequency) for i in range(self.length)] if __name__ == '__main__': sig = Harmonic(7,3,1/2) sig.plot()
如果你需要支持实例化后修改信号参数重新采样的场景,只需要在子类的参数属性修改逻辑里,重新给
self.data赋值为self.sample()的返回值即可,不需要改动基类代码。
内容的提问来源于stack exchange,提问作者ilja
相关产品推荐
相关产品推荐

