Вызов метода класса повышает тип и на питоне
-
29-08-2019 - |
Вопрос
Я не понимаю, как используются занятия. Следующий код дает мне ошибку, когда я пытаюсь использовать класс.
class MyStuff:
def average(a, b, c): # Get the average of three numbers
result = a + b + c
result = result / 3
return result
# Now use the function `average` from the `MyStuff` class
print(MyStuff.average(9, 18, 27))
Ошибка:
File "class.py", line 7, in <module>
print(MyStuff.average(9, 18, 27))
TypeError: unbound method average() must be called with MyStuff instance as first argument (got int instance instead)
Что случилось?
Решение
Вы можете создать экземпляр класса, объявив переменную и вызывая класс, как если бы он был функцией:
x = mystuff()
print x.average(9,18,27)
Тем не менее, это не будет работать с кодом, который вы нам дали. Когда вы вызываете метод класса на данном объекте (x), он всегда передает указатель на объект как первый параметр, когда он вызывает функцию. Так что, если вы запустите свой код прямо сейчас, вы увидите это сообщение об ошибке:
TypeError: average() takes exactly 3 arguments (4 given)
Чтобы исправить это, вам нужно изменить определение среднего метода, чтобы принять четыре параметра. Первый параметр является ссылкой на объект, а остальные 3 параметра будут для 3 чисел.
Другие советы
Из вашего примера мне кажется, что вы хотите использовать статический метод.
class mystuff:
@staticmethod
def average(a,b,c): #get the average of three numbers
result=a+b+c
result=result/3
return result
print mystuff.average(9,18,27)
Обратите внимание, что тяжелое использование статических методов в Python, как правило, является симптомом некоторого неприятного запаха - если вам действительно нужны функции, то объявьте их непосредственно на уровне модуля.
Чтобы минимально изменить ваш пример, вы можете изменить код на:
class myclass(object):
def __init__(self): # this method creates the class object.
pass
def average(self,a,b,c): #get the average of three numbers
result=a+b+c
result=result/3
return result
mystuff=myclass() # by default the __init__ method is then called.
print mystuff.average(a,b,c)
Или расширить его более полно, позволяя добавлять другие методы.
class myclass(object):
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
def average(self): #get the average of three numbers
result=self.a+self.b+self.c
result=result/3
return result
a=9
b=18
c=27
mystuff=myclass(a, b, c)
print mystuff.average()
Каждая функция внутри класса, и каждая переменная класса должна принимать себя аргумент как указан.
class mystuff:
def average(a,b,c): #get the average of three numbers
result=a+b+c
result=result/3
return result
def sum(self,a,b):
return a+b
print mystuff.average(9,18,27) # should raise error
print mystuff.sum(18,27) # should be ok
Если задействованы переменные класса:
class mystuff:
def setVariables(self,a,b):
self.x = a
self.y = b
return a+b
def mult(self):
return x * y # This line will raise an error
def sum(self):
return self.x + self.y
print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y
print mystuff.mult() # should raise error
print mystuff.sum() # should be ok
Вам нужно потратить немного больше времени на некоторые основы объектно-ориентированного программирования.
Это звучит резко, но это важно.
Ваше определение класса неверно - хотя синтаксис является приемлемым. Определение просто неправильно.
Ваше использование класса для создания объекта полностью отсутствует.
Ваше использование класса для проведения расчета неуместно. Такие вещи можно сделать, но это требует расширенной концепции
@staticmehod
.
Поскольку ваш пример кода неверен во многих отношениях, вы не можете получить аккуратный ответ «исправить этот». Есть слишком много вещей, чтобы исправить.
Вам нужно будет взглянуть на лучшие примеры определений классов. Не ясно, какой исходный материал вы используете, чтобы учиться, но какая бы книга, которую вы читаете, либо неправильная, либо неполная.
Пожалуйста, откажитесь от любой книги или источника, который вы используете, и найдите лучшую книгу. Серьезно. Они вводят вас в заблуждение на то, как выглядит определение класса и как оно используется.
Вы можете посмотреть http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html Для лучшего знакомства с классами, объектами и питоном.
В функции члена Python в классе потребность явно self
аргумент То же, что и неявное this
Указатель в C ++. Для получения более подробной информации, пожалуйста, проверьте это страница.
Попробуй это:
class mystuff:
def average(_,a,b,c): #get the average of three numbers
result=a+b+c
result=result/3
return result
#now use the function average from the mystuff class
print mystuff.average(9,18,27)
или это:
class mystuff:
def average(self,a,b,c): #get the average of three numbers
result=a+b+c
result=result/3
return result
#now use the function average from the mystuff class
print mystuff.average(9,18,27)
Вы никогда не создавали экземпляр.
Вы определили среднее как метод экземпляра, таким образом, для того, чтобы использовать среднее значение, вам нужно сначала создать экземпляр.