Класс Python, вызывающий другой метод

Я не понимаю, почему этот код не работает:

import numpy as np 

class Normalizer:
    def __init__(self,x):
        self.x = x 
    def mean(self):
        return np.sum(self.x)/np.size(self.x)
    def mean_zero(self):
        return self.x - self.x.mean()
    def new_calc(self):
        return self.x.mean_zero()

    a = np.random.randint(150,200,(5,8))

    heights = Normalizer(a)


    print(a)
    print(heights.mean()) 
    print(heights.mean_zero())
    print(heights.mean_zero().mean())
    print(heights.new_calc())

Он правильно выполняет heghts.mean_zero(), но в методе def new_calc(self) не выполняет его. Было бы здорово, если бы кто-нибудь объяснил мне это. Спасибо!

mean_zero - это метод класса. Вы не можете вызвать его с помощью переменной вашего класса.

Jay Modi 01.02.2019 08:19

Используйте self.mean_zero() вместо self.x.mean_zero()

DirtyBit 01.02.2019 08:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
60
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вместо self.x.mean zero() напишите self.mean_zero()

import numpy as np 

class Normalizer:
   def __init__(self,x):
       self.x = x 
   def mean(self):
       return np.sum(self.x)/np.size(self.x)
   def mean_zero(self):
       return self.x - self.mean()
   def new_calc(self):
       return self.mean_zero()

a = np.random.randint(150,200,(5,8))

heights = Normalizer(a)


print(a)
print(heights.mean()) 
print(heights.mean_zero())
print(heights.mean_zero().mean())
print(heights.new_calc())
Ответ принят как подходящий

Я не уверен, что такое x из __init__, но очень вероятно, что вы действительно хотите вызвать mean_zero в new_calc в контексте переменной self (тот же объект):

def new_calc(self):
        return self.mean_zero()

Вы инициализируете Normalizer с помощью «a», что является результатом np.random.randint, который возвращает объект numpy.ndarray.

В методе new_calc вы пытаетесь вызвать метод mean_zero объекта ndarray, но в ndarray такого метода нет. mean_zero является метод нормализатора, но self.x не относится к типу нормализатора.

Я не уверен, что должен делать этот код new_calc. Если вы можете сделать это яснее, я могу оказать больше помощи.

new_calc был просто упрощением для отладки того, что я на самом деле пытаюсь выполнить. Фактический код будет выглядеть так: def variance(self): return (np.sum((self.x.mean_zero()**2)))/ np.size(self.x)

Magnus Hoglund 01.02.2019 08:30

Виновник:

def new_calc(self):
        return self.x.mean_zero()

Причина:

self.x является атрибутом класса Normalizer. Итак, если heights является экземпляром класса Normalizer, то heights.x — это self.x.

Ответ:

def new_calc(self):
        return self.mean_zero()

Обоснование:

AttributeError: 'numpy.ndarray' object has no attribute 'mean_zero'

ndarray не имеет такого метода. mean_zero - это метод нормализатора

I don't understand why this code doesn't work:

если вы запустите следующий код, он выдаст ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'mean_zero'
  • найти проблему, единственное место, где вызывается mean_zero, это метод new_calc. Итак, первый шаг сделан.

  • проанализировать, если вы посмотрите на класс Normalize, то у него есть один атрибут x, который имеет тип numpy.ndarray. Если внимательно прочитать сообщение об ошибке, то там написано, что тип ndarray не имеет атрибута mean_zero. С другой стороны, у вас есть метод mean_zero, определенный в вашем классе, и именно его вы должны вызывать.

Эти два шага приводят к выводу, что проблема в методе new_calc:

def new_calc(self):
    return self.mean_zero() #(wrong)return self.x.mean_zero()

Другие вопросы по теме