Как преобразовать обычную функцию в функцию внутри класса? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь упорядочить свой код, реализовав классы и выполняя методы для создания экземпляров классов.Я потратил несколько часов на то, чтобы понять, как использовать классы, но до сих пор не понял этого.Может ли кто-нибудь мне помочь?

Это оригинальный код:

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 голосов
/ 05 июня 2019

Как говорит @ deceze ♦ в комментарии, вы не создали экземпляр класса SignalDataIOUnit, поэтому он не работает.

Чтобы заставить его работать, у вас есть 2 варианта:

  1. Создание объекта SignalDataIOUnit и вызов метода readSignalAcquisitionData:
timeStamps, dataInput = SignalDataIOUnit(fileName).readSignalAcquisitionData()
Используйте Python @staticmethod декоратор :
class SignalDataIOUnit:
    def __init__(self, fileName):
        self.fileName = fileName

    @staticmethod
    def readSignalAcquisitionData(fileName):
        ...

, затем просто позвоните как обычно

timeStamps, dataInput = SignalDataIOUnit.readSignalAcquisitionData(fileName)
0 голосов
/ 05 июня 2019

да, вы должны использовать, как это

fileName="LabsWeek03_inputData.csv"

timeStamps, dataInput = SignalDataIOUnit(fileName).readSignalAcquisitionData()
print(timeStamps)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...