Pythonは「.」でオブジェクトの属性に直接追加アクセスすることができますが、組み込み関数のsetattr、getattr、delattrを使用すると明示的に属性の操作をすることができます。
setattr
オブジェクトに属性を追加することができます。第1引数に対象となるオブジェクト、第2引数に属性名、第3引数に属性値を設定します。
class User(): pass obj = User() setattr(obj, "name", "Kuro") print(obj.name)
.で追加しても良いのですが、setattrはdict型のループと相性が良いです。よく見かけるテクニックとして、インスタンス生成時に属性が多くなる場合、引数をdictにして属性を追加する、という方法があります。
class User(): def __init__(self, attrs): for k, v in attrs.items(): setattr(self, k, v) obj = User({"name": "Kuro", "age": 30, "memo": "very cool!"}) print(obj.name) # Kuro print(obj.age) # 30 print(obj.memo) # very cool!
属性が多岐にわたる場合、引数で指定すると膨大になりますが、この方法ならば可変で様々な属性を付加することができます。
補足 getattrとdelattr
補足として、setattrの兄弟、getattrとdelattrを紹介します。
getattr 属性の取得
引数で指定した属性を取得します。第1引数で対象オブジェクトを、第2引数で属性名を指定します。また、第3引数でデフォルト値を設定できるのがメリットです。
当該の属性がない場合はデフォルト値が返されるため、属性存在検査を事前にする必要がなくなるわけです。
例えば、getattr(obj, 'name')は obj.nameと等価となります。
また、objにnameという属性がないことが予想され、デフォルト値を設定したい場合はgetattr(obj, 'name', 'Nameless')のように記述します。
デフォルト値がなく、指定した属性がない場合hAttributeErrorが送出されます。
delattr 属性の削除
属性を削除することができます。例えば、objというオブジェクトからnameという属性を削除する場合、delattr(obj, "name")と記述します。