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