Метод класса не возвращает значение при доступе через наследование - PullRequest
0 голосов
/ 01 июня 2019

У меня есть метод класса, который перестает возвращать значение, когда я пытаюсь получить доступ через унаследованный подкласс.

Понятия не имею, что заставляет его не возвращать соответствующее значение.

Вот что у меня есть:

class KNN():    
    def __init__(self, neighbors=5, centered=True):
        self.neighbors = neighbors
        self.centered  = centered

    def _get_distance(self, xi):
        return np.sqrt(((xi - self.X_fit)**2).sum(1))

    def fit(self, X, y):
        if self.centered:
            self.X_fit = standardize(X)
        else:
            self.X_fit = X
        self.y_fit     = y

    def predict(self, X, centered=False):
        m, n              = X.shape[0], self.X_fit.shape[0]
        self.dist_matrix  = np.zeros((m, n))
        X_pred            = np.zeros(X.shape)

        if standardize:
           X_pred  = standardize(X)
        else:
           X_pred  = X

        for row in range(m):
            self.dist_matrix[row] = self._get_distance(X_pred[row])

        self.idx_vals      = np.argsort(self.dist_matrix)[:, :self.neighbors]
        self.y_idx         = self.y_fit[self.idx_vals]
        self.preds         = [self.neighbor_calculation(self.y_idx[i]) for i in range(len(self.y_idx))]
        return self.preds

Если я получу доступ к классу KNN напрямую, *Метод 1009 * работает как задумано, и возвращает массив предсказанных значений.

Однако он останавливается, когда я пытаюсь создать подкласс, который наследуется от KNN:

class KNNClassifier(KNN):
    def predict(self, X, centered=False):
        self.neighbor_calculation = majority_vote
        super().predict(X, standardize)

Когда я обращаюсь к методу predict через класс KNNClassifier, он не возвращает значение.

Однако self.preds содержит фактические прогнозы.

Но при попытке что-то вроде KNNClassifier.predict(X)[:10] выдается сообщение об ошибке:

'NoneType' object is not subscriptable'

Я не знаю, почему возвращаемое значение внезапно интерпретируется как None.

1 Ответ

1 голос
/ 01 июня 2019

Вы используете super для вызова родительского метода от дочернего, что верно, но вам нужно использовать return для возврата значения:

return super().predict(X, standardize)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...