1

同じような質問を見つけましたが、私の質問は異なります

def trace ():
   ?

class A():
  @staticmethod
  def Aha():
     trace ()
     ...

トレース出力が欲しい

A.Aha()が呼び出されました

instance.method検査によって関数名を取得し、次のようなのクラス名を取得する方法を知っています。

self_argument = frame.f_code.co_varnames[0]  # This *should* be 'self'.
instance = frame.f_locals[self_argument]
class_name = instance.__class__.__name__

しかし、クラス静的メソッドには自己引数がありません。どうすればよいですか?

4

2 に答える 2

1

のラッパー/デコレータの作成を試みることができますAha。デコレータがそうであることを知らない場合は、これこれを読むことをお勧めします。

次のようなものは、関数名を出力してから関数を呼び出す必要があります。

def wrapper(func):
    def inner(*args, **kwargs):
        print("function {0} has been called".format(func.__name__))
        return func(*args, **kwargs)
    return inner

@wrapper
def f():
   print "I'm in the function

戻り値

In [16]: f()
function f has been called
in the function
于 2013-02-09T08:58:13.620 に答える
1

これが静的メソッドの定義そのものです。クラス引数なしで(クラスメソッドのように)、インスタンス引数なしで(インスタンスメソッドのように)呼び出されます。モジュールスコープで宣言された関数と静的メソッドの唯一の実際の違いは、メソッド名がモジュールの名前空間ではなくクラスの名前空間で定義されていることです。

つまり、クラスオブジェクトに直接アクセスすることはできません。スタックを調べることで関数名を取得できます(ただし、それがどれほど役立つかはわかりません)。

>>> import sys
>>> import traceback
>>> class A(object):
        @staticmethod
        def a():
            trace()
>>> def trace():
        print traceback.extract_stack(sys._getframe())[-3][3]
>>> A.a()
A.a()

そして、名前を指定すると、名前から抽出してモジュールの名前空間で検索することにより、クラスオブジェクトにアクセスできます...

参考のために:

frame @ -1:traceback.extract_stack()の呼び出し
frame @ -2:trace()
の呼び出しframe @ -3:Aa()の呼び出し

于 2013-02-09T08:40:43.630 に答える