2016-07-19 3 views
-1

Я довольно новичок в Python. Здесь я создаю класс для представления структуры, похожей на blob. Тем не менее, мой код дает следующее сообщение об ошибке:Базовый класс класса Python ТипError

TypeError: add() takes 3 positional arguments but 4 were given

class Blob: 
    mass = 0 
    xvals = [] 
    yvals = [] 
    correlationVal = 0 

    def __init__(self): 
     Blob.mass = 0 
     Blob.correlationVal = 0 

    def add(x, y, newCorrel): 
     Blob.correlationVal = computeCorrelation(newCorrel) 
     Blob.mass += 1 
     Blob.xvals.append(x) 
     Blob.yvals.append(y) 

    def computeCorrelation(newCorrel): 
     prevCorrel = Blob.correlationVal*Blob.mass 
     updatedCorrel = (prevCorrel + newCorrel)/(Blob.mass + 1) 
     return updatedCorrel 

if __name__ == "__main__": 

    test1 = Blob() 
    print(test1.mass) 
    test1.add(0, 0, 12) 
    print(test1.mass) 
    print(test1.correlationVal) 
    test1.add(0, 1, 10) 
    print(test1.mass) 
    print(test1.correlationVal) 
    test1.add(1, 1, 11) 
    print(test1.mass) 
    print(test1.correlationVal) 
    print(test1.xvals) 
    print(test1.yvals) 

Что я делаю неправильно здесь, и как я отказываюсь 4 входа, когда я поставляю 3?

Примечание: ошибка возникает из строки "test1.add (0, 0, 12)".

+6

Ваши методы должны принимать себя как первый параметр .. ie def add (self, x, y, newCorrel): – AK47

+0

Возможный дубликат [Какова цель self в Python?] (Http://stackoverflow.com)/questions/2709821/what-is-the-purpose-of-self-in-python) –

+0

Вы должны потратить некоторое время на чтение раздела [Классы в учебнике] (https://docs.python.org/3/tutorial /classes.html#classes) - вам может потребоваться повторное его повторение несколько раз: 9.1) Имена и объекты и 9.2) Подсекции областей и пространств имен довольно важны для понимания. Если атрибут предназначен как атрибут * instance * '' 'self'', обычно используется для имени экземпляра, и он всегда является первым аргументом, переданным методу экземпляра. – wwii

ответ

4

Ваши методы экземпляра не хватает self ссылка:

def computeCorrelation(self, newCorrel) 
#      ^

def add(self, x, y, newCorrel) 
#  ^

Первый параметр передается с помощью метода экземпляра является ссылка на этот экземпляр класса. Таким образом, ваш метод addдолжен принять 4 аргумента, но вам потребуется только передать 3, когда метод вызывается из экземпляра класса. Python передает вам ссылку на этот экземпляр.


Более того, вы ссылаетесь свои атрибуты из класса себя как Blob.some_attribute, вы должны использовать self:

def __init__(self): 
    self.mass = 0 
    self.correlationVal = 0 

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

+0

Кроме того, методы должны относиться к экземпляру 'self', а не к классу' Blob'. Первая строка '__init __ (self)' будет выглядеть следующим образом: 'self.mass = 0' – Aaron

+1

@Aaron Да, работал над этим –

+0

Я вижу. Спасибо всем за отзыв! –

1

в классе, первый аргумент функции - self. Когда в основном вы вызываете test1.add(0, 0, 12), питон звонит test1.add(test1,0, 0, 12), так что теперь у него есть 4 аргумента.

class Blob: 
    mass = 0 
    xvals = [] 
    yvals = [] 
    correlationVal = 0 

def __init__(self): 
    self.mass = 0 
    self.correlationVal = 0 

def add(self,x, y, newCorrel): 
    self.correlationVal = computeCorrelation(self,newCorrel) 
    self.mass += 1 
    self.xvals.append(x) 
    self.yvals.append(y) 
+1

'self' - это просто конвенция, но это хорошо! давайте держать это – pwnsauce

0

Первый аргумент метода класса Python, должен быть self т.е. def add(self, x, y, newCorrel): вместо def add(x, y, newCorrel):.

Self неявно передается методам экземпляра класса, когда они вызывают, поэтому почему 4 аргумента передаются вместо трех, которые вы явно передаете.

N.B. Методы, отличные от экземпляра (статические методы), не требуют от себя самого первого параметра. См. here для более подробной информации.

Смежные вопросы