2017-03-28 8 views
2

内からクラスの名前を取得するだから、私は、基本クラスを持っている:は、クラス定義

class Foo(): 
    pass 

私は、このクラスをインスタンス化するつもりはありませんよ - 私はちょうどカスタム名前空間としてそれをしたいです。私はそれからしたいことの一つは、その名前です:

>>> Foo.__name__ 
'Foo' 

しかし、私は何のアンダースコアがありませんように、これまでのインターフェースを変更したいです。クラスオブジェクトからクラスの名前を取得することは多く発生するので、よりクリーンでなければなりません:

class Foo: 
    def name(): 
     return Foo.__name__ 

これは素晴らしいです!ああ、「Foo」という名前がハードコードされていることを除いて。私は文字列を返すようにしてもよいでしょう。

class Bar(Foo): 
    pass 

>>> Bar.name() 
'Foo' 

んブエノ:私はこの調整を継承する必要があるので、それは、十分ではありません。

基本的には、クラスの名前を返すクラス関数が必要です。この関数は、継承されても機能します。私はインスタンスを作っていないので、自己を使うことはできません。同様の結果が得られるものはありますか?関数は呼び出された名前空間について知っていますか?私が実際にオブジェクトを使用する必要がある場合、私の目的は単純なクラス階層よりも醜いでしょう。

編集:私はこの質問がリンクされているものと同じであるとは思わない。私の例では、オブジェクトのインスタンス化を明示的に避けているので、他の質問に提供されたソリューション(主に.__ class__属性の呼び出し)はこの質問の答えとしては機能しません。また、@classmethodデコレータを使用してクラスオブジェクトを「自己」エスクargとして取得することで、ここで提供されている最善の答えは、リンクされた代替のどこにも現れません。また、私は自分の疑問がその重複しているというよりはっきりとした基本的な方法で構想されていると信じています。選ばれた答えにも同じことが起こります。

+1

をclassmethod' – vaultah

+0

'self'の引数を期待しているので、私のエラーが表示されます – Eric

答えて

4

だけ@classmethodでそれクラスメソッド作り、中に渡されたクラスの名前を返します。

class Foo: 
    @classmethod 
    def name(cls): 
     return cls.__name__ 

class Bar(Foo): pass 

これは、それぞれの場合に正しい名前を返す: `上@まで読む

>>> Foo.name() 
'Foo' 
>>> Bar.name() 
'Bar' 
+1

デコレータについて読んでいただき、ありがとうございました。すごくいいですね。 –