You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:24:24