2011-07-07 9 views
24

Jestem nowy w Pythonie i napisałem ten prosty skrypt:„<method> przyjmuje żadnych argumentów (1 podano)”, ale dałem żaden

#!/usr/bin/python3 
import sys 

class Hello: 
    def printHello(): 
     print('Hello!') 

def main(): 
    helloObject = Hello() 
    helloObject.printHello() # Here is the error 

if __name__ == '__main__': 
    main() 

Kiedy go uruchomić (./hello.py) pojawia się następujący komunikat o błędzie :

Traceback (most recent call last): 
    File "./hello.py", line 13, in <module> 
    main() 
    File "./hello.py", line 10, in main 
    helloObject.printHello() 
TypeError: printHello() takes no arguments (1 given) 

Dlaczego Python myśleć dałem printHello() argumentu, a ja z pewnością nie zrobił? Co zrobiłem źle?

+1

możliwe duplikat [Błąd kompilatora Pythona x przyjmuje żadnych argumentów (1 podano)] (http://stackoverflow.com/questions/4445405/python-compiler-error -x-takes-no-arguments-1-given) – IanAuld

Odpowiedz

39

Błąd odnosi się do niejawnego argumentu self, który jest przekazywany niejawnie podczas wywoływania metody takiej jak helloObject.printHello(). Ten parametr musi być wyraźnie zawarty w definicji metody instancji. Powinno to wyglądać tak:

class Hello: 
    def printHello(self): 
     print('Hello!') 
6

Jeśli chcesz printHello jako metody instancji, powinien odbierać siebie jako argumentu zawsze (ant pyton minie niejawnie) Chyba że chcesz printHello jako metody statycznej, to musisz używać @staticmethod

#!/usr/bin/python3 
import sys 

class Hello: 
    def printHello(self): 
     print('Hello!') 

def main(): 
    helloObject = Hello() 
    helloObject.printHello() # Here is the error 

if __name__ == '__main__': 
    main() 

jako '@staticmethod'

#!/usr/bin/python3 
import sys 

class Hello: 
    @staticmethod 
    def printHello(): 
     print('Hello!') 

def main(): 
    Hello.printHello() # Here is the error 

if __name__ == '__main__': 
    main() 
+1

[Metoda klasy] (http://docs.python.org/library/functions.html#classmethod)! = metoda statyczna. –

+0

Przepraszam .. Miałem na myśli statyczne –

6

wywołanie metody na wystąpienie obiektu zwrotów sam obiekt (zwykle self) do obiektu. Na przykład wywołanie Hello().printHello() jest takie samo, jak wywołanie Hello.printHello(Hello()), które wykorzystuje wystąpienie obiektu Hello jako pierwszego argumentu.

Zamiast definiować swoje oświadczenie printHello jak def printHello(self):