Python のオブジェクトは、属性 (データ属性とそれら (メソッド) を操作する関数) を持つことができます。実際、すべてのオブジェクトには組み込みの属性があります ( Python コンソールで 、 、 をdir(None)
試してdir(True)
くださいdir(...)
) 。dir(dir)
たとえば、、 などperson
のいくつかの属性を持つオブジェクト があるとします。name
gender
これらの属性 (メソッドまたはデータ オブジェクト) にアクセスするには、通常person.name
、person.gender
、person.the_method()
、 などを記述します。
しかし、プログラムを作成する時点で属性の名前がわからない場合はどうなるでしょうか。たとえば、属性の名前が という変数に格納されているとしますattr_name
。
もしも
attr_name = 'gender'
次に、書く代わりに
gender = person.gender
あなたは書ける
gender = getattr(person, attr_name)
いくつかの練習:
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
>>> class Person():
... name = 'Victor'
... def say(self, what):
... print(self.name, what)
...
>>> getattr(Person, 'name')
'Victor'
>>> attr_name = 'name'
>>> person = Person()
>>> getattr(person, attr_name)
'Victor'
>>> getattr(person, 'say')('Hello')
Victor Hello
getattr
指定さAttributeError
れた名前の属性がオブジェクトに存在しない場合に発生します。
>>> getattr(person, 'age')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
ただし、そのような属性が存在しない場合に返されるデフォルト値を 3 番目の引数として渡すことができます。
>>> getattr(person, 'age', 0)
0
getattr
withを使用してdir
、すべての属性名を反復処理し、それらの値を取得できます。
>>> dir(1000)
['__abs__', '__add__', ..., '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> obj = 1000
>>> for attr_name in dir(obj):
... attr_value = getattr(obj, attr_name)
... print(attr_name, attr_value, callable(attr_value))
...
__abs__ <method-wrapper '__abs__' of int object at 0x7f4e927c2f90> True
...
bit_length <built-in method bit_length of int object at 0x7f4e927c2f90> True
...
>>> getattr(1000, 'bit_length')()
10
これの実用的な使い方は、名前が で始まるすべてのメソッドを見つけてtest
呼び出すことです。
その名前を持つオブジェクトの属性を設定できるものがありますgetattr
:setattr
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>