Вопрос

Я не понимаю, как используются занятия. Следующий код дает мне ошибку, когда я пытаюсь использовать класс.

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)

Вы никогда не создавали экземпляр.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top