setattr()【属性設定】
getattr()【属性取得】
delattr()【属性削除】
hasattr()【属性有無判定】
dir()【名前リスト・属性リスト】

setattr()【属性設定】

メモ

構文

setattr(object, name, value)

戻り値なし
objectオブジェクト
name属性名 (文字列)
value属性値
object.__setattr__(self, name, value)

戻り値なし
self自オブジェクト
name属性名
value属性値

例 (属性の設定)

class ClassAttr:
    pass


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
obj.attr2 = "VALUE_2"

print(getattr(obj, "attr1"))  # 出力:VALUE_1
print(obj.attr2)              # 出力:VALUE_2

setattr(obj, "attr1", "VALUE_1_NEW")
obj.attr2 = "VALUE_2_NEW"

print(getattr(obj, "attr1"))  # 出力:VALUE_1_NEW
print(obj.attr2)              # 出力:VALUE_2_NEW

例 (コンストラクタ指定)

# コンストラクタ指定 (辞書)
class ClassAttr:
    def __init__(self, attrs):
        for key, value in attrs.items():
            setattr(self, key, value)
            print(F'setattr(self, "{key}", {value})')


dic = {
    "attr1": "VALUE_01",
    "attr2": "VALUE_02",
    "attr3": 33,
}
obj = ClassAttr(dic)
# 出力:setattr(self, "attr1", VALUE_01)
# 出力:setattr(self, "attr2", VALUE_02)
# 出力:setattr(self, "attr3", 33)

print(getattr(obj, "attr1"))  # 出力:VALUE_01
print(getattr(obj, "attr2"))  # 出力:VALUE_02
print(getattr(obj, "attr3"))  # 出力:33
# コンストラクタ指定 (キーワード引数)
class ClassAttr:
    def __init__(self, **kwargs):
        for kw in kwargs:
            setattr(self, kw, kwargs[kw])
            print(F'setattr(self, "{kw}", {kwargs[kw]})')


obj = ClassAttr(attr1="VALUE_001", attr2="VALUE_002", attr3=333)
# 出力:setattr(self, "attr1", VALUE_001)
# 出力:setattr(self, "attr2", VALUE_002)
# 出力:setattr(self, "attr3", 333)

print(getattr(obj, "attr1"))  # 出力:VALUE_001
print(getattr(obj, "attr2"))  # 出力:VALUE_002
print(getattr(obj, "attr3"))  # 出力:333
# コンストラクタ指定 (各種)
class ClassAttr:
    def __init__(self, attr1, attr2, dic, *args, attr31="V_31", attr32="V_32", **kwargs):
        # 固定属性 (attr51・attr52)
        setattr(self, "attr51", "V_51")
        print(F'setattr(self, "attr51", {self.attr51})')
        self.attr52 = "V_52"
        print(F'self.attr52 = {self.attr52}')
        # 位置引数 (attr1・attr2)
        setattr(self, "attr1", attr1)
        print(F'setattr(self, "attr1", {attr1})')
        self.attr2 = attr2
        print(F'self.attr2 = {attr2}')
        # 辞書
        for name, value in dic.items():
            setattr(self, name, value)
            print(F'setattr(self, "{name}", {value})')
        # 可変長引数 (attr21~)
        i = 21
        for arg in args:
            name = "attr" + str(i)
            setattr(self, name, arg)
            print(F'setattr(self, "{name}", {arg})')
            i = i + 1
        # キーワード引数 (attr31・attr32 デフォルト値あり)
        setattr(self, "attr31", attr31)
        print(F'setattr(self, "attr31", {attr31})')
        self.attr32 = attr32
        print(F'setattr(self, "attr32", {attr32})')
        # キーワード引数
        for kw in kwargs:
            setattr(self, kw, kwargs[kw])
            print(F'setattr(self, "{kw}", {kwargs[kw]})')


dic = {
    "attr11": "V_11",
    "attr12": "V_12",
}
obj = ClassAttr("V_1", "V_2", dic, "V_21", "V_22", attr41="V_41", attr42="V_42")
# 出力:setattr(self, "attr51", V_51)
# 出力:self.attr52 = V_52
# 出力:setattr(self, "attr1", V_1)
# 出力:self.attr2 = V_2
# 出力:setattr(self, "attr11", V_11)
# 出力:setattr(self, "attr12", V_12)
# 出力:setattr(self, "attr21", V_21)
# 出力:setattr(self, "attr22", V_22)
# 出力:setattr(self, "attr31", V_31)
# 出力:setattr(self, "attr32", V_32)
# 出力:setattr(self, "attr41", V_41)
# 出力:setattr(self, "attr42", V_42)

print(getattr(obj, "attr1"))  # 出力:V_1
print(getattr(obj, "attr2"))  # 出力:V_2

print(getattr(obj, "attr11"))  # 出力:V_11
print(getattr(obj, "attr12"))  # 出力:V_12

print(getattr(obj, "attr21"))  # 出力:V_21
print(getattr(obj, "attr22"))  # 出力:V_22

print(getattr(obj, "attr31"))  # 出力:V_31
print(getattr(obj, "attr32"))  # 出力:V_32

print(getattr(obj, "attr41"))  # 出力:V_41
print(getattr(obj, "attr42"))  # 出力:V_42

print(getattr(obj, "attr51"))  # 出力:V_51
print(getattr(obj, "attr52"))  # 出力:V_52

例 (カスタマイズ)

# __setattr__()
class ClassAttr(object):
    def __setattr__(self, name, value):
        print(F'__setattr__(self, "{name}", {value})')
        super().__setattr__(name, "DEBUG_" + value)


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
# 出力:__setattr__(self, "attr1", VALUE_1)
obj.attr2 = "VALUE_2"
# 出力:__setattr__(self, "attr2", VALUE_2)

print(getattr(obj, "attr1"))
# 出力:DEBUG_VALUE_1
print(obj.attr2)
# 出力:DEBUG_VALUE_2

getattr()【属性取得】

メモ

構文

getattr(object, name[, default])

戻り値属性値
objectオブジェクト
name属性名 (文字列)
defaultデフォルトの属性値
例外AttributeError 例外 (属性が存在せず、default 未指定)
object.__getattr__(self, name)

戻り値属性値
self自オブジェクト
name属性名
例外AttributeError 例外
※ AttributeError 例外 または 明示的な呼び出しで実行
object.__getattribute__(self, name)

戻り値属性値
self自オブジェクト
name属性名
例外AttributeError 例外
※ 再帰呼び出しの防止の為、基底クラスを呼び出し (例:object.__getattribute__(self, name) )

例 (属性の取得)

class ClassAttr:
    pass


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
setattr(obj, "attr2", "VALUE_2")

print(getattr(obj, "attr1"))  # 出力:VALUE_1
print(obj.attr2)              # 出力:VALUE_2

print(getattr(obj, "attr3", "DEFAULT"))  # 出力:DEFAULT
#print(getattr(obj, "attr3"))  # AttributeError 例外
#print(obj.attr3)              # AttributeError 例外

例 (カスタマイズ)

# __getattr__()
class ClassAttr:
    def __getattr__(self, name):
        print(F'__getattr__(self, "{name}")')
        return "GETATTR"


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")

print(getattr(obj, "attr1"))
# 出力:VALUE_1

print(obj.attr1)
# 出力:VALUE_1

print(getattr(obj, "attr2", "DEFAULT"))
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR

print(getattr(obj, "attr2"))
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR

print(obj.attr2)
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR
# __getattribute__()・__getattr__()
class ClassAttr(object):
    def __getattribute__(self, name):
        print(F'__getattribute__(self, "{name}")')
        value = "DEBUG_" + super().__getattribute__(name)
        return value

    def __getattr__(self, name):
        print(F'__getattr__(self, "{name}")')
        return "GETATTR"


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")

print(getattr(obj, "attr1"))
# 出力:__getattribute__(self, "attr1")
# 出力:DEBUG_VALUE_1

print(obj.attr1)
# 出力:__getattribute__(self, "attr1")
# 出力:DEBUG_VALUE_1

print(getattr(obj, "attr2", "DEFAULT"))
# 出力:__getattribute__(self, "attr2")
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR

print(getattr(obj, "attr2"))
# 出力:__getattribute__(self, "attr2")
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR

print(obj.attr2)
# 出力:__getattribute__(self, "attr2")
# 出力:__getattr__(self, "attr2")
# 出力:GETATTR

delattr()【属性削除】

メモ

構文

delattr(object, name)

戻り値なし
objectオブジェクト
name属性名
例外AttributeError 例外 (指定属性の存在なし)
object.__delattr__(self, name)

戻り値なし
self自オブジェクト
name属性名 (文字列)

例 (属性の削除)

class ClassAttr:
    pass


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
obj.attr2 = "VALUE_2"

delattr(obj, "attr1")
del obj.attr2
print(hasattr(obj, "attr1"))  # 出力:False
print(hasattr(obj, "attr2"))  # 出力:False

#delattr(obj, "attr1")  # AttributeError 例外
#del obj.attr2          # AttributeError 例外

例 (カスタマイズ)

# __delattr__()
class ClassAttr(object):
    def __delattr__(self, name):
        print(F'__delattr__(self, "{name}")')
        try:
            super().__delattr__(name)
        except AttributeError as e:
            print(type(e))


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
setattr(obj, "attr2", "VALUE_2")

delattr(obj, "attr1")
# 出力:__delattr__(self, "attr1")
del obj.attr2
# 出力:__delattr__(self, "attr2")
print(hasattr(obj, "attr1"))  # 出力:False
print(hasattr(obj, "attr2"))  # 出力:False

delattr(obj, "attr1")
# 出力:__delattr__(self, "attr1")
# 出力:<class 'AttributeError'>
del obj.attr2
# 出力:__delattr__(self, "attr2")
# 出力:<class 'AttributeError'>

hasattr()【属性有無判定】

メモ

構文

hasattr(object, name)

戻り値属性の存在有無 (True:存在有 / False:存在無)
objectオブジェクト
name属性名 (文字列)

例 (属性の有無判定)

class ClassAttr:
    pass


obj = ClassAttr()
setattr(obj, "attr1", "VALUE_1")
obj.attr2 = "VALUE_2"

print(hasattr(obj, "attr1"))  # True
print(hasattr(obj, "attr2"))  # True
print(hasattr(obj, "attr3"))  # False

dir()【名前リスト・属性リスト】

メモ

構文

dir([object])

戻り値objectの指定有無により下記のリスト (アルファベット順)
objectなし:ローカルスコープの名前リスト
objectあり:オブジェクトの属性リスト
objectオブジェクト
object.__dir__(self)

戻り値オブジェクトの属性リスト
self自オブジェクト

例 (名前リスト・属性リストを取得)

xyz = 123

for name in dir():
    print(name)
# 出力:(例)
# 出力:__annotations__
# 出力:__builtins__
# 出力:__doc__
# 出力:__file__
# 出力:__loader__
# 出力:__name__
# 出力:__package__
# 出力:__spec__
# 出力:xyz
class ClassAttr:
    pass


obj = ClassAttr()
setattr(obj, "attr2", "VALUE_2")
setattr(obj, "attr1", "VALUE_1")

for name in dir(obj):
    print(name)
# 出力:__class__
# 出力:__delattr__
# 出力:(省略)
# 出力:__subclasshook__
# 出力:__weakref__
# 出力:attr1
# 出力:attr2

obj = 123
for name in dir(obj):
    print(name)
# 出力:__abs__
# 出力:__add__
# 出力:(省略)
# 出力:__trunc__
# 出力:__xor__
# 出力:bit_length
# 出力:conjugate
# 出力:denominator
# 出力:from_bytes
# 出力:imag
# 出力:numerator
# 出力:real
# 出力:to_bytes

例 (カスタマイズ)

# __dir__()
class ClassAttr(object):
    def __dir__(self):
        print("[__dir__(self)]")
        lst = super().__dir__()
        lst.append("z_user")
        lst.append("a_user")
        return lst  # 自動的にソート


obj = ClassAttr()
setattr(obj, "attr99", "VALUE_99")
setattr(obj, "attr01", "VALUE_01")

for name in dir(obj):
    print(name)
# 出力:[__dir__(self)]
# 出力:__class__
# 出力:__delattr__
# 出力:(省略)
# 出力:__subclasshook__
# 出力:__weakref__
# 出力:a_user
# 出力:attr01
# 出力:attr99
# 出力:z_user