2012-04-23 49 views
16

Trong trăn, bạn có thể tạo các phiên bản có thể gọi được bằng cách triển khai phương thức __call__. Ví dụKhi nào tôi nên triển khai __call__

class Blah: 
    def __call__(self): 
     print "hello" 

obj = Blah() 
obj() 

Nhưng tôi cũng có thể thực hiện một phương pháp của riêng tôi, nói 'chạy':

class Blah: 
    def run(self): 
     print "hello" 

obj = Blah() 
obj.run() 

Khi nào tôi nên thực hiện __call__?

+9

Khi có ý nghĩa. –

+12

Nếu bạn không chắc chắn nếu bạn cần '__call__', thì bạn không cần' __call__'. –

Trả lời

19

Điều này khó trả lời. Ý kiến ​​của tôi là bạn không bao giờ nên xác định __call__ trừ khi mục tiêu thực tế của bạn là tạo ra một hàm. Nó không phải là một cái gì đó bạn sẽ làm gì sau khi bạn đã tạo ra một đối tượng truyền thống.

Nói cách khác, nếu bạn bắt đầu nghĩ "Tôi sẽ tạo một đối tượng", bạn sẽ không bao giờ phải thực hiện __call__. Mặt khác, nếu bạn bắt đầu nghĩ "Tôi sẽ tạo ra một hàm ... nhưng tôi ước tôi có thể sử dụng khung đối tượng để cho hàm của tôi có trạng thái nào đó" thì bạn có thể tạo hàm như một đối tượng trạng thái và xác định __call__ để làm cho nó hoạt động như một hàm.

tôi muốn bao gồm một chút cuối cùng của tư vấn được cung cấp bởi @Paul Manta trong một chú thích cho câu hỏi, nơi ông đã viết:

Nếu bạn không chắc chắn nếu bạn cần __call__, sau đó bạn không cần __call__

Tôi nghĩ đó là lời khuyên hữu ích.

+0

+1 - Đôi khi đóng cửa chỉ trở thành một mớ hỗn độn không thể nói ra, và một đối tượng có thể gọi là một cách tiếp cận tốt hơn. Nhưng đó là về nó. – detly

Các vấn đề liên quan