如何将普通函数转换为类内部的函数?

时间:2019-06-05 12:15:05

标签: python class oop

我试图通过实现类并在类实例上执行方法来组织我已有的代码。我花了一些时间来弄清楚如何使用类,但仍然没有弄清楚。有人可以帮我吗?

这是原始代码:

def readSignalAcquisitionData(fileName):

    f = open(fileName, 'r')

    # dummy read
    f.readline()

    timeStamps = []
    dataInput = []

    for ln in f:
        # parse info
        timeStr, dataStr = ln.split(',')
        timeStamps.append(float(timeStr))
        dataInput.append(float(dataStr))

    f.close()

    return timeStamps, dataInput

这是我目前拥有的:

class SignalDataIOUnit:

    def __init__(self, fileName):

        self.fileName = fileName

    def readSignalAcquisitionData(self):

        f = open(self.fileName, 'r')



        self.timeStamps = []
        self.dataInput = []

        for ln in f:
            # parse info
            self.timeStr, self.dataStr = ln.split(',')
            self.timeStamps.append(float(self.timeStr))
            self.dataInput.append(float(self.dataStr))

        f.close()

        return self.timeStamps, self.dataInput
    def writeFilteredData(self, fileName, timeStamps, dataOut):
        pass

fileName="LabsWeek03_inputData.csv"
timeStamps, dataInput = SignalDataIOUnit.readSignalAcquisitionData(fileName)
print(timeStamps)

当我尝试通过终端运行它时,出现以下错误消息:

Traceback (most recent call last):
  File "SignalDataEvaluationUnit_OOP.py", line 26, in <module>
    timeStamps, dataInput = SignalDataIOUnit.readSignalAcquisitionData(fileName)
  File "SignalDataEvaluationUnit_OOP.py", line 7, in readSignalAcquisitionData
    f = open(self.fileName, 'r')
AttributeError: 'str' object has no attribute 'fileName'

2 个答案:

答案 0 :(得分:0)

是的,您应该这样使用

fileName="LabsWeek03_inputData.csv"

timeStamps, dataInput = SignalDataIOUnit(fileName).readSignalAcquisitionData()
print(timeStamps)

答案 1 :(得分:0)

正如@ deceze♦在评论中说的,您尚未实例化类SignalDataIOUnit,这就是为什么它不起作用的原因。

要使其正常运行,您有2种选择:

  1. 实例化SignalDataIOUnit对象并调用方法readSignalAcquisitionData
timeStamps, dataInput = SignalDataIOUnit(fileName).readSignalAcquisitionData()
  1. 使用Python的@staticmethod装饰器
class SignalDataIOUnit:
    def __init__(self, fileName):
        self.fileName = fileName

    @staticmethod
    def readSignalAcquisitionData(fileName):
        ...

然后照常叫它

timeStamps, dataInput = SignalDataIOUnit.readSignalAcquisitionData(fileName)