0

そのようなものが存在するかどうかは正直わかりませんが、調査を試みたところ、d-Busと呼ばれるものと混同され、それがここで探しているものかどうかわかりませんでした。

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

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

a = BigClass()
a.foo()

ここでやろうとしているのは、foo()が呼び出されているときにLogger()メソッドを呼び出すことです。クラスまたはすべてのメソッドで特定のメソッドが呼び出されたときにlogger()を起動するようなイベント/シグナルを作成したいと思います。

4

2 に答える 2

1

私はあなたの特定の状況を知りませんが、 http dispatch//pydispatcher.sourceforge.net/と呼ばれる良いシグナル/コールバックライブラリがあります

しかし、私はPyDispatcherに基づいて作成されたDjangoディスパッチャーを使用することを好みますが、信号の作成はより直感的です:https ://github.com/django/django/blob/master/django/dispatch/dispatcher.py

ここでやろうとしているのは、foo()が呼び出されているときにLogger()メソッドを呼び出すことです。クラスまたはすべてのメソッドで特定のメソッドが呼び出されたときにlogger()を起動するようなイベント/シグナルを作成したいと思います。

Logger次に、メソッドから手動でメソッドを呼び出してみませんfooか?または、次のように使用するデコレータを作成することをお勧めします。

class BigClass(Object):

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

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


a = BigClass()
a.foo()
于 2012-06-20T12:36:42.257 に答える
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()ます。ただし、これにより実行時のオーバーヘッドが大幅に増加し、実際にはデバッグやパフォーマンスの低下に問題がない状況にのみ適しています。

于 2012-06-20T13:24:43.947 に答える