Как создать экземпляр класса в Python


Итак, я пытаюсь изучить Python. Это кажется довольно простым, но, очевидно, я не понимаю, как используются классы. Следующий код дает мне ошибку, когда я пытаюсь использовать класс.

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)

Что случилось?

8 61

8 ответов:

Вы можете создать экземпляр класса, объявляя переменную и вызвать класс, как если бы это были функции:

x = mystuff()
print x.average(9,18,27)

однако, это не будет работать с кодом, который вы дали нам. При вызове метода класса для данного объекта (x) он всегда передает указатель на объект в качестве первого параметра при вызове функции. Поэтому, если вы запустите свой код прямо сейчас, вы увидите это сообщение об ошибке:

TypeError: average() takes exactly 3 arguments (4 given)

чтобы исправить это, вам нужно будет изменить определение среднего метод для того чтобы принять 4 параметра. Первый параметр является ссылкой на объект, а остальные 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()

каждая функция внутри класса, и каждая переменная класса должна принимать self

вам нужно потратить немного больше времени на некоторые основы объектно-ориентированного программирования.

Это звучит жестко, но это важно.

  • ваше определение класса неверно - хотя синтаксис оказывается приемлемым. Это определение просто неверно.

  • использование класса для создания объекта полностью отсутствует.

  • использование класса для выполнения вычислений неуместно. Этот что-то можно сделать, но это требует продвинутой концепции @staticmehod.

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

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

пожалуйста, отбросьте любую книгу или Источник вы используете и найти лучшую книгу. Серьезно. Они ввели вас в заблуждение относительно того, как выглядит определение класса и как оно используется.

вы можете посмотреть на http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html для лучшего ознакомления с классами, объектами и Python.

в python функции-члена класса нужно явное

попробуйте это:

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)

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

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