2011-07-07 6 views
24

Tôi mới vào Python và Tôi đã viết kịch bản đơn giản này:"<method> không có đối số (1 nhất định)" nhưng tôi đã không

#!/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() 

Khi tôi chạy nó (./hello.py) Tôi nhận được thông báo lỗi sau :

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) 

Tại sao Python nghĩ tôi đã printHello() một cuộc tranh cãi trong khi tôi đã làm rõ ràng không? Tôi đã làm gì sai?

+1

thể trùng lặp của [Python biên dịch lỗi, x không có đối số (1 nhất định)] (http://stackoverflow.com/questions/4445405/python-compiler-error -x-take-no-arguments-1-given) – IanAuld

Trả lời

39

Lỗi này đề cập đến đối số ngầm định self được truyền hoàn toàn khi gọi một phương thức như helloObject.printHello(). Tham số này cần được bao gồm một cách rõ ràng trong định nghĩa của một phương thức thể hiện. Nó sẽ giống như thế này:

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

Nếu bạn muốn printHello như phương pháp dụ, nó sẽ nhận được tự như là đối số luôn (python kiến ​​sẽ vượt qua ngầm) Trừ khi bạn muốn printHello như một phương pháp tĩnh, sau đó bạn sẽ phải sử dụng @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() 

Như '@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

[Phương thức lớp] (http://docs.python.org/library/functions.html#classmethod)! = phương thức tĩnh. –

+0

xin lỗi .. tôi có nghĩa là tĩnh –

6

Gọi một phương pháp trên thể hiện của một đối tượng lợi nhuận đối tượng chính nó (thường là self) cho đối tượng. Ví dụ: gọi số Hello().printHello() giống như gọi số Hello.printHello(Hello()), sử dụng một đối tượng của đối tượng Hello làm đối số đầu tiên.

Thay vào đó, xác định tuyên bố printHello của bạn như def printHello(self):