如何在Python OOP中调用另外两个类的属性至PCM类计算snr_tot?
修正后的Python面向对象代码及说明
问题分析
原代码存在以下关键问题:
PCM类的方法缺少self参数,无法访问实例属性- 方法中直接使用未定义的
class_a、class_b变量 ADC类的m属性未引用self.n_bit,会触发变量未定义错误- 继承与实例传参的设计混乱,导致属性访问逻辑冲突
修正后的代码
import numpy as np # 补充lin2db函数示例实现(原代码未提供,实际使用需匹配需求) def lin2db(val): return 10 * np.log10(val) class ADC(): n_bit = np.array([2, 3, 4, 6, 8, 10, 12, 14, 16], dtype=np.int64) @property def snr(self): M = 2 ** self.n_bit snr_lin = M ** 2 return snr_lin @property def snr_db(self): snr_lin = self.snr snr_db = lin2db(snr_lin) return snr_db @property def m(self): return 2 ** self.n_bit class BSC(): fs_step = 2.75625e3 error_probability = np.arange(1e-12, fs_step, 1) n_bit = np.array([2, 3, 4, 6, 8, 10, 12, 14, 16], dtype=np.int64) @property def snr_BSC(self): snr_lin_BSC = 1 / (4 * self.error_probability) return snr_lin_BSC @property def snr_db(self): snr_lin_BSC = self.snr_BSC snr_db = lin2db(snr_lin_BSC) return snr_db class PCM(): def __init__(self, adc_instance, bsc_instance): self.analog_bandwidth = 0 self.adc = adc_instance # 保存ADC实例引用 self.bsc = bsc_instance # 保存BSC实例引用 @property def snr_tot(self): # 通过实例引用访问对应属性 return (1 / self.adc.snr + 1 / self.bsc.snr_BSC) ** (-1) def critical_pe(self): return 1 / (4 * (self.adc.m ** 2 - 1)) # 测试并打印结果 if __name__ == "__main__": adc = ADC() bsc = BSC() pcm = PCM(adc, bsc) print("总SNR(线性值):", pcm.snr_tot)
核心修改说明
- 给
PCM类的所有方法添加self参数,通过self访问实例内部的ADC/BSC对象 - 将
PCM改为组合模式(而非多重继承),更符合逻辑:PCM依赖ADC和BSC的功能,而非继承它们的属性 - 修复
ADC类m属性的self引用问题 - 将
snr_TOT改为属性(@property),调用方式更直观 - 添加完整测试代码,实现打印
snr_tot的功能 - 补充
lin2db函数的基础实现(原代码未提供,需根据实际需求调整)
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

