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")と記述します。
