我编写了一个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
答案 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__()
称为初始化过程的一部分。