Подтвердить что ты не робот

Как создать экземпляр класса в 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)

Что не так?

4b9b3361

Ответ 1

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

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

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

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

Чтобы исправить это, вам нужно будет изменить определение среднего метода для принятия четырех параметров. Первый параметр - это ссылка на объект, а остальные 3 параметра будут для трех чисел.

Ответ 2

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

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

Ответ 3

Чтобы минимально изменить ваш пример, вы можете изменить код на:

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)

Или расширить его более полно, позволяя добавлять другие методы.

#!/usr/bin/env python

import sys

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()

Ответ 4

Каждая функция внутри класса и каждая переменная класса должны принимать аргумент self как указано.

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

Ответ 5

В функции-члене python класса нужен явный аргумент self. То же, что и неявный указатель this в С++. Для получения дополнительной информации, пожалуйста, просмотрите эту страницу.

Ответ 6

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

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

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

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

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

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

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

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

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

Ответ 7

Попробуйте следующее:

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)

Ответ 8

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

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