2012-06-20 79 views
0

我不老老實實地知道這樣的事情是否存在,但我試圖做一些研究,並最終變得與d-Bus的東西混淆,並不確定是否這就是我在這裏尋找的,創建方法信號自動啓動python中的事件

class BigClass(Object): 
    def Foo(self): 
    print 'calling foo' 

    def Logger(self): 
    print 'foo has been called' 

a = BigClass() 
a.foo() 

我在這裏要做的是在調用foo()時調用Logger()方法。我想創建某種事件/信號,當我的類或所有方法調用特定的方法時,它會觸發logger()。

+0

你可能想'對象'和'富',而不是'對象'和'富'。 –

回答

1

我不知道你的具體情況,但有一個叫dispatch良好的信號/回調lib目錄下:http://pydispatcher.sourceforge.net/

但我更喜歡使用這是基於PyDispatcher創建Django的調度員,但signal creation is more intuitivehttps://github.com/django/django/blob/master/django/dispatch/dispatcher.py

我在這裏試圖做的是調用Logger()方法,當foo()是 被調用。我想創建某種事件/信號,當我的類或 所有方法調用特定方法時,它將觸發記錄器()。

爲什麼不從foo方法手動調用Logger方法?或者更好做裝飾用它喜歡:

class BigClass(Object): 

    def Logger(self): 
    print 'foo has been called' 

    @log(Logger) 
    def Foo(self): 
    print 'calling foo' 


a = BigClass() 
a.foo() 
+0

感謝這有助於很多 –

0

而明確的記錄調用(或記錄裝飾,如warwaruk建議)是最直接的方法,它可以自動記錄,如果你願意發揮命名技巧,例如通過Foo實施邏輯foo方法。 Python是區分大小寫的,所以它們是分離的和獨特的。然後實施__getattr__方法,像這樣:

class AutoLogger(object): 

    def __getattr__(self, attr): 
     try: 
      return self.__class__.__dict__[attr] 
     except KeyError: 
      func = self.__class__.__dict__[attr.capitalize()] 
      return lambda *args, **kwargs: self.log_call(attr, func, *args, **kwargs) 

    def log_call(self, func_name, func, *args, **kwargs): 
     func(self, *args, **kwargs) 
     print func_name, 'has been called (handled by', func_name.capitalize() + ')' 

class BigAutoLoggerClass(AutoLogger): 
    def Foo(self): 
     print 'calling Foo' 


b = BigAutoLoggerClass() 
b.Foo() 
print "---" 
b.foo() 

這產生了:

calling Foo 
--- 
calling Foo 
foo has been called (handled by Foo) 

bar將類似地由Bar來實現,等等。

如果您不喜歡這個輕微的命名,也可以通過sys.settrace()函數自動記錄日誌。但是,這增加了很多運行時間開銷,並且僅適用於調試或低(ish)性能不錯的情況。