2009-04-09 9 views
1

クラス名を含む文字列を使用してクラス自体を参照するにはどうすればよいですか?Python:文字列からのクラスへの参照?

 
>>> b = SomeSubClass() 
>>> b.display_var() 
Traceback (most recent call last): 
    File "", line 1, in 
    File "", line 4, in display_var 
AttributeError: 'str' object has no attribute 'the_var' 
>>> 

ありがとう:
は...

class WrapperClass: 
    def display_var(self): 
     #FIXME: self.__class_name__.__name__ is a string 
     print self.__class__.__name__.the_var 

class SomeSubClass(WrapperClass): 
    var = "abc" 

class AnotherSubClass(WrapperClass): 
    var = "def" 

と明らかにエラーメッセージが表示され、この(動作しない)exempleを参照してください!

答えて

5

クラス自体を参照するようにクラス名を含む文字列を使用する方法

クラス特別ではありません、彼らはただの変数に含まれる値ているあなたが言った場合:?。

class X(object): pass 

グローバルスコープでは、変数 'X'はクラスオブジェクトへの参照になります。

あなたはそう、「グローバルを()」を使用して辞書として現在のスクリプト/モジュールのグローバル変数を取得することができます:

classobj= globals()[self.__class__.__name__] 
print classobj.var 

locals()もローカル変数のために利用可能であり、それらの間あなたは必要はありません。デビッド・ノートなどの変数にアクセスするためにひどいeval()を使用する)

はしかし、self.__class__はすでにclassobjなので、名前でグローバル変数からのフェッチについて実行して行く必要はありません。 self.__class__.varは問題ありません。実際には:

print self.var 

これは通常の方法です。クラスメンバは、インスタンスが名前を別のもので上書きしない限り、インスタンスのメンバとして使用できます。

+0

+1うまく説明しました –

+0

hmmm: "変数 'X'は参考になります。正確ではありません。識別子 "X"はクラスオブジェクト自体であり、定数が使用されるところならどこでも使用できます。 –

+0

確かに。私が不器用な英語で説明しようとしているのは、Xはクラスオブジェクトですが、実際は単なる参考にすぎません。 「X」に何か他のものを割り当てた場合、それはもはや存在しません。重要な点は、Pythonでは名前「X」が特別なものにならないことです。それは単なる別の変数です。 – bobince

1

print self.__class__.varを呼び出すと、あなたの例はうまくいくはずです。私はその名前を使う必要はないと思う。

+0

ハハ、意味があります!どうもありがとう。 – Orphee

+0

明らかにそうではありませんが、なぜ彼は答えを知っているかどうか尋ねるでしょうか? –

2

あなたはこの文字列を取得する場所に応じて、任意の一般的な方法は、このような方法の一つは、単にeval(string)を使用することです(安全でないかもしれ最善の方法は、クラスにdictのマッピング名を定義することです:。

class WrapperClass: 
    def display_var(self): 
     #FIXME: self.__class_name__.__name__ is a string 
     print d[self.__class__.__name__].the_var 

class SomeSubClass(WrapperClass): 
    the_var = "abc" 

class AnotherSubClass(WrapperClass): 
    the_var = "def" 

d = {'WrapperClass': WrapperClass, 'SomeSubClass': SomeSubClass, 'AnotherSubClass': AnotherSubClass} 
AnotherSubClass().display_var() 
# prints 'def' 
関連する問題