28

Tôi muốn thực hiện mô hình Observable bằng Python cho một vài công nhân, và đã xem qua đoạn hữu ích này:Thực hiện một cuộc gọi lại bằng Python - đi qua một tài liệu tham khảo có thể được gọi với chức năng hiện

class Event(object): 
    pass 

class Observable(object): 
    def __init__(self): 
     self.callbacks = [] 
    def subscribe(self, callback): 
     self.callbacks.append(callback) 
    def fire(self, **attrs): 
     e = Event() 
     e.source = self 
     for k, v in attrs.iteritems(): 
      setattr(e, k, v) 
     for fn in self.callbacks: 
      fn(e) 

Nguồn: Here

Khi tôi hiểu nó, để subscribe, tôi sẽ cần phải chuyển một cuộc gọi lại đến chức năng sẽ được gọi trên fire. Nếu hàm gọi là phương thức class, có lẽ tôi có thể đã sử dụng self, nhưng trong trường hợp không có điều này - làm thế nào tôi có thể trực tiếp nhận được gọi lại có thể hữu ích cho bit self.callbacks.append(callback)?

Trả lời

47

Bất kỳ chức năng được xác định có thể được thông qua bằng cách đơn giản sử dụng tên gọi của nó, mà không cần thêm các () ở đầu mà bạn sẽ sử dụng để gọi nó:

def my_callback_func(event): 
    # do stuff 

o = Observable() 
o.subscribe(my_callback_func) 

khác ví dụ tập quán:

class CallbackHandler(object): 
    @staticmethod 
    def static_handler(event): 
     # do stuff 

    def instance_handler(self, event): 
     # do stuff 

o = Observable() 

# static methods are referenced as <class>.<method> 
o.subscribe(CallbackHandler.static_handler) 

c = CallbackHandler() 
# instance methods are <class instance>.<method> 
o.subscribe(c.instance_handler) 

# You can even pass lambda functions 
o.subscribe(lambda event: <<something involving event>>) 
+1

Thiếu tham số 'tự' trong phương thức. –

+1

Rất tiếc. Quên nó trên phương pháp dụ. Phương thức tĩnh không nhận được 'self'. – Amber

+1

Tuyệt vời, cảm ơn bạn rất nhiều - Tôi đã vật lộn với tĩnh trong thực tế :) – malangi

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