setattr 属性の追加

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