Python类中__init__函数内定义的变量无法在其他类方法中调用问题
问题根源
你遇到的报错本质是实例属性作用域和类内方法调用规则两个问题导致的,具体错误点如下:
- 你在
__init__构造方法中定义的hop_length、frame_length、final_sample、full_rms、rms_selection等变量都是构造方法的局部变量,仅在__init__运行期间有效,不会被保存到类实例中,其他类方法自然无法访问 - 类内调用其他实例方法需要加
self.前缀,你在get_min_energy_sample里直接写find_nearest()会被识别为全局函数,找不到就会报错 get_min_energy_sample方法定义时多余传入了track和sr参数,这两个值已经保存在实例属性里,不需要重复传参,否则你调用时不传参也会触发参数不匹配报错
修正后代码
import librosa import numpy as np class AudioFeatures(object): def __init__(self, track, sr): self.track = track self.sr = sr self.hop_length = 2048 frame_length_in_seconds = 10 self.frame_length = sr * frame_length_in_seconds self.final_sample = int(librosa.get_duration(track) * sr) self.full_rms = librosa.feature.rms(track, frame_length=self.frame_length, hop_length=self.hop_length, center=True) std_rms = np.std(self.full_rms) self.rms_selection = std_rms + (std_rms - (std_rms * (1 - std_rms))) def find_nearest(self, array, value): idx = (np.abs(array - value)).argmin() return idx def get_min_energy_sample(self): min_value = np.mean(self.full_rms) - self.rms_selection min_value_loc = self.find_nearest(self.full_rms, min_value) min_energy_frame_start = librosa.frames_to_samples(min_value_loc, hop_length=self.hop_length) min_energy_frame_end = min_energy_frame_start + self.frame_length # 校验帧长度,不足10秒则取最后10秒 if min_energy_frame_end > self.final_sample: min_energy_sample = self.track[(self.final_sample - self.frame_length): self.final_sample] else: min_energy_sample = self.track[min_energy_frame_start: min_energy_frame_end] return min_energy_sample temp_track = AudioFeatures(file_loc, sr) res = temp_track.get_min_energy_sample()
内容的提问来源于stack exchange,提问作者Colton Dewberry
相关产品推荐
相关产品推荐

