2011-10-06 10 views
5

私はPYにデコレータを持っています。これはメソッドであり、この関数をパラメータとして受け取ります。私は渡された関数に基づいてディレクトリ構造を作成したい。親ディレクトリにモジュール名を使用していますが、サブディレクトリにクラス名を使用したいと考えています。私はfnオブジェクトを所有するクラスの名前を取得する方法を理解できません。デコレータからPython関数の所有クラスを取得

私のデコレータ:

def specialTest(fn): 
    filename = fn.__name__ 
    directory = fn.__module__ 
    subdirectory = fn.__class__.__name__ #WHERE DO I GET THIS 
+0

fn.im_class .__ name__ – janoliver

+0

デコレータで 'is_member_func'と言う特殊な引数を与えます。それが真であれば、最初の引数をselfにします。 –

答えて

8

fninstancemethodであれば、あなたはfn.im_classを使用することができます。

 
>>> class Foo(object): 
...  def bar(self): 
...   pass 
... 
>>> Foo.bar.im_class 
__main__.Foo 

注このデコレータからない動作すること、機能のみクラスが定義され後インスタンスメソッドに変換されるため(@specialTestbarを飾るために使用された場合、すなわち、それはしないだろうもしそれが可能であれば、その時点でそれを行うことは、コールスタックや何かが不幸なものかどうかを調べることによって行う必要があります。

+0

それは私が恐れていたものです。ありがとう。 –

+0

何らかの理由で、私がコードに戻ってしまうまで、これは登録されませんでした。これは可能ですが、FNがインスタンスであるラップ関数内のFNと対話するコードを移動するだけでよいのです。 –

+0

これは定義時には不可能ですが、クラスの作成後に装飾された関数をリストすることができます:これを達成するために、デコレータはクラスにマーカー属性を配置する必要があります – kolypto

6

Python 2では、メソッドオブジェクトにim_class属性を使用できます。 Python 3では、__self__.__class__(またはtype(method.__self__))になります。