Почему функция Init возвращает тип объекта, а другие функции возвращают NoneType - PullRequest
0 голосов
/ 24 апреля 2019

Я написал программу на python, чтобы попытаться оценить мои ML-прогнозы, используя объектно-ориентированное программирование, и я пытаюсь объединить функции в цепочку. Как сказать:

answers = predictionsGrader().merge_on('PassengerId').compare("Survived_x", "Survived_y").grade()

Однако мой код начал выдавать ошибки атрибута error.

AttributeError: 'NoneType' object has no attribute 'compare'

Пытаясь понять, в чем проблема, я понял, что хотя инициализация возвращала объект,

<class 'predictionsGrader.predictionsGrader'>

функция, которая была вызвана после инициализации (которая является merge_on функцией), возвращала NoneType

<class 'NoneType'>

Пожалуйста, что может быть не так. Вот полный код:

import pandas as pd

class predictionsGrader():

    def __init__(self, predictions, target):
        self.correct = []
        self.predictions = predictions
        self.target = target
        return


    def merge_on(self, row):
        self.row = row
        self.md = pd.merge(self.predictions, self.target, on=[self.row])
        return


    def compare(self, predicted_target, confirmed_target):
        self.predicted_target = predicted_target or "predicted_target"
        self.confirmed_target = confirmed_target or "confirmed_target"
        return


    def grade(self):
        for x in range(len(self.md[self.predicted_target])):
            if (self.md[self.predicted_target][x] == self.md[self.confirmed_target][x]):
                self.correct.append("right")
            else:
                self.correct.append("wrong")
        return self.correct

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Если вы хотите подобный интерфейс с текучей средой, ваши методы (кроме __init__) должны возвращать self.

class predictionsGrader():

    def __init__(self, predictions, target):
        self.correct = []
        self.predictions = predictions
        self.target = target

    def merge_on(self, row):
        self.row = row
        self.md = pd.merge(self.predictions, self.target, on=[self.row])
        return self

    def compare(self, predicted_target, confirmed_target):
        self.predicted_target = predicted_target or "predicted_target"
        self.confirmed_target = confirmed_target or "confirmed_target"
        return self

    def grade(self):
        for x in range(len(self.md[self.predicted_target])):
            if (self.md[self.predicted_target][x] == self.md[self.confirmed_target][x]):
                self.correct.append("right")
            else:
                self.correct.append("wrong")
        return self.correct

__init__ не должны ничего возвращать - это инициализатор,не конструктор.

1 голос
/ 24 апреля 2019

predictionsGrader() - это не то же самое, что predictionsGrader.__init__().__init__() вызывается как часть процесса инициации некоторой магией Python в фоновом режиме.

...