setattr【属性設定】
getattr【属性取得】
delattr【属性削除】
hasattr【属性有無判定】
dir【名前リスト・属性リスト】
setattr【属性設定】
メモ
- 属性の設定 〔 例 〕
- 属性を属性名(文字列)で設定
object.name = value と等価 (コーディング時に属性名が必要) - 初期設定で明示的な属性設定が必要な場合、コンストラクタで指定 〔 例 〕
(dict【辞書型】・キーワード引数の使用も可能) - カスタマイズする場合、__setattr__() を実装 〔 例 〕
- 固定の属性名でアクセスする場合、@property【プロパティ デコレータ】・property【プロパティ クラス】も考慮
- 属性を属性名(文字列)で設定
- 関連
- 外部リンク
構文
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【属性取得】
メモ
- 属性の取得 〔 例 〕
- 属性を属性名(文字列)で取得
object.name と等価 (コーディング時に属性名が必要) - カスタマイズする場合、 __getattr__()・__getattribute__() を実装 〔 例 〕
- 固定の属性名でアクセスする場合、@property【プロパティ デコレータ】・property【プロパティ クラス】も考慮
- 属性を属性名(文字列)で取得
- 関連
- 外部リンク
構文
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【属性削除】
メモ
- 属性の削除 〔 例 〕
- 属性を属性名(文字列)で削除
del object.name と等価 (コーディング時に属性名が必要) - カスタマイズする場合、__delattr__() を実装 〔 例 〕
- 固定の属性名でアクセスする場合、@property【プロパティ デコレータ】・property【プロパティ クラス】も考慮
- 属性を属性名(文字列)で削除
- 関連
- 外部リンク
構文
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【属性有無判定】
メモ
- 属性の有無判定 〔 例 〕
- 属性の有無を属性名(文字列)で判定
- 固定の属性名でアクセスする場合、@property【プロパティ デコレータ】・property【プロパティ クラス】も考慮
- 関連
- 外部リンク
構文
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