2016-03-29 14 views
2

ハードコードされた関数の名前を文字列に変換するコマンドが必要なときに、それを探して組み込みの__name__関数を使い始めました。問題は、__name__が希望の名前を取得する方法を理解しているとは思わないということです。私はそれがローカル()またはdir()で現在見えるものと関係があることを知っていますが、それはそれです...私は解決する方法がわからないという間違いの中で。ここでこの場合、__name__はなぜ機能しないのですか? AttributeErrorが発生しました

は私のエラーを再現するいくつかのコードです:私は、リストに私の静的メソッドを入れて、ときにしようとしていることであるだから、なぜ

AttributeError: 'staticmethod' object has no attribute '__name__' 

class Abc: 
    @staticmethod 
    def my_static_func(): 
     return 

    def my_method(self): 
     return 

    class_list = [my_static_func] 
    method_list = [my_method] 

#These calls work 
Abc.my_static_func.__name__ 
Abc.my_method.__name__ 
Abc.method_list[0].__name__ 

#But This call raises an AttributeError 
Abc.class_list[0].__name__ 

は、私は、このエラーメッセージが表示されますそれが機能しないリストから関数の名前を取得しますか?この質問が愚かであれば私を許してください。あなたがはっきりとわかるように、私は__name__がどのように働くのかという基本原則を理解していません(これらのトピック名を与えることさえ知りません!)。答えはいいですが、いくつかのドキュメントへの参照も歓迎されるでしょう。このコード

@staticmethod 
def my_static_method(...): 
    .... 

my_static_methodstaticmethodに包まれている機能で

+1

私はこれを見つけました:http://stackoverflow.com/questions/1987919/why-can-decorator-not-decorate-a-staticmethod-or-a-classmethod。明らかにstaticmethodは関数を返さない:classmethodとstaticmethodは関数ではなく記述子オブジェクトを返す。ほとんどのデコレータは記述子を受け入れるように設計されていません。 –

答えて

2

。クラスからstaticmethodにアクセスすると、ある種の魔法がstaticmethodに発生し、実際に正しい関数が返されます。それはあなたがなぜアクセスできるのですか__name__

staticmethodをリストに入れてそのリストからアクセスすると、魔法が発生しなくなり、staticmethodオブジェクトが返されます。 staticmethodとして

Abc.my_static_func # this is a function 
Abc.class_list[0] # this is a staticmethod object 

は、その__name__にアクセスするとき__name__あなたはAttibuteErrorを取得する必要はありません。

あなたは属性にアクセスするときに起こる「魔法」についての詳細を調べるためにstaticmethod

Abc.class_list[0].__func__   # the function 
Abc.class_list[0].__func__.__name__ # its name 

から基本的な機能を得ることができ、あなたの問題を解決するために/クラス/オブジェクトのメソッドは、descriptors

を検索します
+0

それで、staticmethodオブジェクトは関数オブジェクトと異なりますか?クールに感謝します。 – Dzhao

+1

そうです。これは、正しくアクセスされた場合、元の関数を返す小さなラッパーです。 – Wombatz

関連する問題