2012-12-31 25 views
6

Khi nào tôi nên sử dụng __init__ và khi phương pháp __call__?__init__ hoặc __call__?

Tôi đang bối rối về việc liệu tôi có nên sử dụng thứ nhất hoặc thứ hai hay không.

Hiện tại tôi có thể sử dụng cả hai, nhưng tôi không biết cái nào phù hợp hơn.

+2

Vâng, bạn đang cố gắng làm gì? – arshajii

+0

Bạn có thể sử dụng cả hai và triển khai cả hai. Nếu bạn không cho chúng tôi biết bạn đang cố gắng làm gì, chúng tôi có thể giúp gì? Bạn có thấy tài liệu gây nhầm lẫn không? Phần nào bị nhầm lẫn? –

+2

liên quan: http://stackoverflow.com/questions/9663562/what-is-difference-between-init-and-call-in-python –

Trả lời

15

Hai thứ này hoàn toàn khác nhau.

__init__() là hàm tạo, nó được chạy trên các phiên bản mới của đối tượng.

__call__() được chạy khi bạn cố gắng gọi một thể hiện của đối tượng như thể nó là một hàm.

Ví dụ: Giả sử chúng ta có một lớp, Test:

a = Test() #This will call Test.__init__() (among other things) 
a() #This will call Test.__call__() 
+1

Tôi đã nhận nó ngay bây giờ, cảm ơn ! – JeremyL

+1

Trừ khi chúng được tạo ra giống nhau ... Tôi xây dựng các lớp Tokenizer chuỗi lười biếng có thể gọi lặp lại được. Để giữ DRY triển khai và cung cấp cho người dùng các API tương đương, '__call __()' trả về 'self', và' __init __() 'gọi' __call __() 'với cùng các đối số. Hãy tưởng tượng 'tokens = list (Tokenizer (doc, ngrams = 2))' giống như 'tokenizer = Tokenizer(); tokens = list (tokenizer (doc, ngrams = 2)) 'giống như' danh sách (tokenizer.tokenize (doc, ngrams = 2)) 'Nó" chỉ hoạt động "bất kể người dùng thích sử dụng nó như thế nào. – hobs

+0

@hobs, ví dụ tuyệt vời! Tại sao bạn không đặt nó như là một câu trả lời? – wombatonfire

9

Xét nghiệm nhanh cho thấy sự khác biệt giữa chúng

class Foo(object): 
    def __init__(self): 
     print "init" 
    def __call__(self): 
     print "call" 

f = Foo() # prints "init" 
f()  # prints "call" 

Trong không có cách nào là những hoán đổi cho nhau

6

Nhiều khả năng, bạn muốn sử dụng __init__. Đây là phương thức được sử dụng để khởi tạo một thể hiện mới của lớp của bạn, mà bạn thực hiện bằng cách gọi lớp đó. __call__ là trong trường hợp bạn muốn làm cho các phiên bản của bạn được gọi. Đó không phải là một cái gì đó thường xuyên được thực hiện, mặc dù nó có thể hữu ích. Ví dụ này sẽ minh họa:

>>> class C(object): 
... def __init__(self): 
...  print 'init' 
... def __call__(self): 
...  print 'call' 
... 
>>> c = C() 
init 
>>> c() 
call 
>>> 
0

Đoạn mã đơn giản sẽ giải thích điều này tốt hơn.

>>> class Math: 
...  def __init__(self): 
...    self.x,self.y=20,30 
...  def __call__(self): 
...    return self.x+self.y 
... 
>>> m=Math() 
>>> m() 
50 
Các vấn đề liên quan