2017-03-29 13 views
0

私は「GETATTR」を使用しようとすると、次のエラーを取得しておいてください。gettar属性エラー - Pythonの

はAttributeError:「str」はオブジェクトが属性を持っていないここにdisplayTime "

は私のコードです使用:

「classNameが」私はリストから取り出され、また、私は私のプログラムを持っているサブクラスの名前でてきた文字列を指し
getattr(className,"displayTime")(self) 

を。 "displayTime"は、そのサブクラス内のメソッドです。

私はそれに直接サブクラスの名前を入力環境でそれをテストしてみました:

getattr(seconds,"displayTime")(self) 

、これがうまく働きました。誰かが私が間違っているアイデアを持っていますか?

ありがとうございます。

+2

を使用すると、クラスオブジェクトをつかむ必要があるだろう'globals()[classname]'を介して。 'getattr'はあなたのためにそれを見つけることはありません。 classname-> classobjの値を保持するディクショナリを作成することを検討してください。そうすれば、 'globals'の処理について心配する必要はありません。 –

+3

文字列ではなく、最初の引数としてインスタンスを使用する必要があります。 – Daniel

+0

'秒'は ''秒 ''ではありません。文字列はテキストを表し、文字列に格納されたテキストと名前が一致するクラスやその他のものは表しません。 – user2357112

答えて

0

getattrを正しく実行しています。問題は、文字列からオブジェクトに変換する必要があることです。この場合は、クラスオブジェクトへの参照です。

クラスを識別する方法は2つあります。まず、親モジュールを使って識別できます。abc.ABCMetaのようなものです。これを行うには、sys.modules辞書で始まり、モジュールとサブモジュールを検索します(つまり、 'abc'を参照)。それから、あなたはその名前の最後の部分( 'ABCMeta')を子供の1人として持つモジュールを持っています。 getattrを使用してモジュールから子を抽出し、getattrを再度使用して、必要なメンバーを取得することができます。

2つ目の方法は、使用しているモジュールのグローバル名前空間に名前があると仮定することです。あなたが何かやった場合たとえば、:

from abc import ABCMeta as chicken 

を次に、あなたのコードでは、グローバルシンボル、chickenを参照してください可能性があり、それは同じことを意味します。この場合、あなたははすでに輸入を行っている場合@Jim Fasarakisヒリアードコメントで示唆されているように、あなたは単に、globals()辞書で'chicken'を調べることができます。

clsname = 'chicken' 
cls = globals()[clsname] 
method = getattr(cls, 'displayTime') 
関連する問題