その属性の名前に対応する文字列を与えられたオブジェクト属性にアクセスする方法


153

tによって与えられた属性の値をどのように設定/取得しますxか?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

回答:


284

と呼ばれる組み込み関数がgetattrありますsetattr

getattr(object, attrname)
setattr(object, attrname, value)

この場合

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
属性を削除するためのdelattrもありますが、これはほとんど使用されません。
デイブカービー

11
そして、オブジェクトに特定のattrがあるかどうかをテストするためのhasattrは、その場合、3つの引数形式getattr(object、attrname、default)を使用する方が良いことがよくあります。
ダンカン

とにかく、このようにgetattrを使用して、dataframe df1と変数x = 'df1'var1の文字列としての変数df1があると言うことができますか?このようなdfの形状を印刷したい、getattr(x, 'shape')またはgetattr('df1', 'shape')。これはgetattrなどの方法では実行できないことを知っています。
ihightower

3

注:この回答は非常に古くなっています。2008年new廃止されたモジュールを使用するPython 2に適用されます。

Pythonには関数setattrとgetattrが組み込まれています。これは、クラスの属性を設定および取得するために使用できます。

簡単な例:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

0

ロジックをクラス内に隠したい場合は、次のように汎用ゲッターメソッドを使用することをお勧めします。

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

出力:

Attribute value of attr1 is 1

それをさらに隠すことができる別のアプローチは、魔法のメソッドを__getattribute__使用することですが、そのメソッド内で属性値を取得しようとすると解決できない無限ループが発生し続けました。

また、を使用することもできますvars()。上記の例では、交換可能性getattr(self,varname)return vars(self)[varname]はなく、getattr答えに応じて望ましいかもしれないとの違いは何varssetattr

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.