为什么初始化函数返回对象类型,而其他函数返回NoneType

时间:2019-04-24 09:16:41

标签: python class oop object nonetype

我编写了一个python程序,尝试使用面向对象的编程对我的ml预测进行评分,并且尝试将函数链接在一起。喜欢说:

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

但是,我的代码开始抛出属性错误的错误。

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 个答案:

答案 0 :(得分:3)

如果您想要这样的流畅接口,则您的方法(__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 :(得分:1)

predictionsGrader()predictionsGrader.__init__()不同。在后台,某些Python魔术将__init__()称为初始化过程的一部分。