2015-06-03 4 views
-1

Я определил функцию, которая принимает 2 аргумента. Когда я вызываю функцию, я получаю сообщение об ошибке сказав не хватает аргумент:Ошибка при вызове функции Python

>>> def fib(self, a,b): 
... self.i=a, self.j=b 
... print self.i+self.j 
... 
>>> fib(4,8) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: fib() takes exactly 3 arguments (2 given) 

>>> fib(4,8,9) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "<stdin>", line 2, in fib 
AttributeError: 'int' object has no attribute 'i' 

Я прошел с обоими 2 и 3 аргументов. Какой должен быть третий аргумент?

+0

Он принимает ** 3 ** аргументы. – vaultah

+0

похоже, что вы определили метод класса, но я не вижу объект класса, на который вы вызываете 'fib'? – EdChum

+1

@EdChum s/class method/method/- в Python «classmethod» - это метод, который воспринимает класс (а не экземпляр) как первый аргумент. –

ответ

1

Я предполагаю, что вы не понимаете self очень хорошо в питоне. Его заголовок в направлении ООП (объектно-ориентированное программирование).

не-ООП подход (делает то же самое со статическими методами)

def fib(a,b): 
    print a+b 

fib(4,8) 

объектно-ориентированного подхода

class Test(): 
    i = 0 
    j = 0 
    def fib(self, a,b): 
     self.i=a 
     self.j=b 
     print self.i+self.j 

t = Test() # create an object of Test class 
t.fib(2, 3) # make the function call 

Примечание: питон рассматривает функцию, чтобы быть статической функцией, если она не имеют ключевое слово self как первый параметр

+0

Первый момент: две переменные на уровне класса бесполезны и вводят в заблуждение. Второй момент: в Питоне нет такой вещи, как «статическая функция». Третий пункт: 'self' не является ключевым словом. Четвертая точка: не называть первый аргумент 'self' метода не имеет значения, метод получит экземпляр как первый аргумент, как описано здесь: https://wiki.python.org/moin/FromFunctionToMethod. –

1

У вас есть 3 аргумента: self, a и b.

self традиционно используется для методов.

Вы пишете (упрощенный пример):

class A: 
    def multiply(self, b): # method called with one argument 
     return 2 * b 

a = A() 
a.multiply(3) 

или

def multiply(b): # this is a function with one argument 
    return 2*b 

mutiply(3) 
+0

s/класс способ/способ /. «Classmethod» - это нечто иное (это метод, который воспринимает класс, а не экземпляр, как первый аргумент). –

+0

Вы правы, плохая формулировка. Я отредактировал ответ. – stellasia