首页 > 解决方案 > Python 类和继承。调用超级方法返回错误

问题描述

我有以下python代码。该代码分析用于放大处理的数字信号,但是由于某种原因,我无法将继承概念应用于此

我有一个父类和一个子类,它将父类设置为参数,以继承其在子类中的属性。

但是,当我尝试使用 OOP 继承原则访问父类中的方法时,出现错误。我最初尝试扩展类而不是重载它,但是当我尝试访问扩展父类中的 dofilter() 方法时,它会抛出错误。但是,如果我尝试在子类中重载 dofilter() 方法,然后使用“super”从父类调用它,则没有错误,但返回“NaN”,这显然意味着我仍然做错了什么。我知道数据正在传递给对象,应该没有理由返回 NaN。它现在让我陷入了一个僵局。谁能解释为什么这不起作用?

我尝试过/我总结的脚本,以更好地描绘问题:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import numpy as np
import matplotlib.pyplot as plt

# =============================================================================
# CLASSES
# =============================================================================

class fir_filter:

    def __init__(self, coefficients):
        self.coefficients = coefficients
        self.buffer = np.zeros(taps)

    def dofilter(self, value, offset): 
        result = 0

        #Splice coefficients and buffer arrays into smaller arrays
        buffer_newest = self.buffer[0:offset+1]
        buffer_oldest = self.buffer[offset+1:taps]
        coefficients1 = self.coefficients[0:offset+1]
        coefficients2 = self.coefficients[offset+1:taps]

        #Accumulate
        self.buffer[offset] = value
        for i in range(len(coefficients1)):
            result += coefficients1[i]*buffer_newest[offset-1-i]
        for i in range(len(coefficients2), 0, -1):
            result += coefficients2[len(coefficients2)-i] * buffer_oldest[i-1]

        return result

class matched_filter(fir_filter):
    def __init__(self,coefficients):
        self.coefficients = coefficients

    def dofilter(self,value,offset):
        super().dofilter(value, offset)

        return result


########################################
#START OF MAIN SCRIPT  
########################################  
#...
#REMOVED- import data files, create vars, perform various calculations.
########################################  


#... RESUME CODE pertinent variables here
m_wavelet = (2/(np.sqrt(3*a*(np.pi**(1/4)))))*(1-((n/a)**2))*np.exp((-n**2)/(2*(a**2)))
m_wavelet = m_wavelet [::-1]
result = np.zeros(l)
offset = 0
plt.figure(6)
plt.plot(m_wavelet)
plt.plot(ecg_3[8100:8800]/len(ecg_3)/300)


########################################  
#instantiated object here, no errors thrown
########################################  
new_filter = matched_filter(m_wavelet)


########################################  
#issue below
######################################## 
for k in range(len(ecg_3)):
    result[k] = new_filter.dofilter(ecg_3[k], offset) #<- Every item in the array is "Nan"
    offset += 1
    if (offset == 2000):
        offset = 0



########################################  
#More removed code/end of script
######################################## 

重要位:

父类:

class fir_filter:

    def __init__(self, coefficients):
        self.coefficients = coefficients
        self.buffer = np.zeros(taps)

    def dofilter(self, value, offset): 
        result = 0

        #Splice coefficients and buffer arrays into smaller arrays
        buffer_newest = self.buffer[0:offset+1]
        buffer_oldest = self.buffer[offset+1:taps]
        coefficients1 = self.coefficients[0:offset+1]
        coefficients2 = self.coefficients[offset+1:taps]

        #Accumulate
        self.buffer[offset] = value
        for i in range(len(coefficients1)):
            result += coefficients1[i]*buffer_newest[offset-1-i]
        for i in range(len(coefficients2), 0, -1):
            result += coefficients2[len(coefficients2)-i] * buffer_oldest[i-1]

        return result

儿童班:

class matched_filter(fir_filter):
    def __init__(self,coefficients):
        self.coefficients = coefficients

    def dofilter(self,value,offset):
        super().dofilter(value, offset)

        return result

代码和问题:

new_filter = matched_filter(m_wavelet)

for k in range(len(ecg_3)):
    result[k] = new_filter.dofilter(ecg_3[k], offset) 

如何访问“fir_filter”中的“dofilter()”,它在“matched_filter”中继承?

任何见解将不胜感激。如有必要,我可以提供更多代码。

标签: pythonclassoopobjectinheritance

解决方案


推荐阅读