Python で getattr() とは何ですか? また、どのように使用しますか? 質問する

Python で getattr() とは何ですか? また、どのように使用しますか? 質問する

私は読んだ記事機能についてはgetattr理解していますが、まだ何のためにあるのか理解できません。

私が理解しているのは、は を呼び出すのと同じだgetattr()ということだけです。getattr(li, "pop")li.pop

これを具体的にいつ、どのように使用すればよいのでしょうか? 実行時まで名前がわからない関数への参照を取得するために使用すると本に書かれていましたが、いつ、なぜこれを使用するのでしょうか?

ベストアンサー1

Python のオブジェクトには、属性 (データ属性と、それらを操作する関数 (メソッド)) を設定できます。実際、すべてのオブジェクトには組み込みの属性があります (Python コンソールで、、、を試してくださいdir(None)) dir(True)dir(...)dir(dir)

たとえば、、などのperson複数の属性を持つオブジェクトがあるとします。namegender

これらの属性 (メソッドまたはデータ オブジェクト) にアクセスするには、通常は、、、person.nameなどを記述します。person.genderperson.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

getattrAttributeError指定された名前の属性がオブジェクト内に存在しない場合に発生します:

>>> 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一緒に使うこともできます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'
>>>

おすすめ記事