Python中如何实现PCM容器类并调用另外三个类的方法?
解决方案
首先纠正一个关键问题:你当前的PCM类采用了多继承的写法,但需求是让它作为容器类持有另外三个类的实例,而非继承它们的特性。所以第一步要修改类的定义逻辑,改用组合(Composition)而非继承(Inheritance)的方式实现。
1. 重构PCM类的初始化与snr方法
在PCM的__init__方法中接收adc、digital_signal、line三个实例作为参数,并将它们保存为类的属性,后续通过这些属性调用对应类的方法:
# 假设db2lin函数已提前定义,示例实现如下: def db2lin(db_value): return 10 ** (db_value / 10) class PCM: def __init__(self, adc_instance, dsi_instance, line_instance): # 将传入的实例保存为类属性 self.adc = adc_instance self.dsi = dsi_instance self.line = line_instance def snr(self): # 1. 获取Digital_signal_information实例的signal_power signal_power = self.dsi.signal_power # 2. 调用Line实例的snr_digital方法,传入信号功率 snr_db = self.line.snr_digital(signal_power) # 3. 用db2lin转换为线性格式并返回结果 return db2lin(snr_db)
2. 在exercise函数中完成实例化与调用
按照需求,在外部函数中完成三个基础类的实例化,再传入PCM容器类:
def exercise(): # 初始化三个基础类的实例(ADC需传入自身所需的初始化参数) dsi = Digital_signal_information(1, 2, 3) adc = ADC(...) # 替换为ADC类要求的初始化参数 line = Line(1, 2) # 初始化PCM容器类,传入三个实例 pcm_system = PCM(adc, dsi, line) # 调用PCM的snr方法获取最终结果 final_snr = pcm_system.snr() print(final_snr) # 执行测试 exercise()
关键说明
- 避免不必要的继承:你的需求是让PCM作为传输系统的容器,持有其他组件实例,而非成为这些组件的子类。继承适用于"是一个"的关系(比如PCM是一种ADC),但这里是"包含"关系(PCM包含ADC、信号信息和线路),所以组合更符合设计逻辑。
- 调用其他类方法的正确方式:通过PCM类中保存的实例属性(比如
self.dsi、self.line)直接调用对应类的方法,逻辑和你单独测试这些类时完全一致。
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

