Python.use(better) #特殊メソッド __setattr__
Python.use(better)
特殊メソッド __setattr__
《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28
特殊メソッド __setattr__
>>> help(object.__setattr__) ... __setattr__(...) x.__setattr__('name', value) <==> x.name = value
メソッド __setattr__ は、演算子 . に呼応して、オブジェクトの属性を参照する方法を規定します。
■ 全項目を確認する
全ステップの「項目」を確認するには、関数 do を利用します。
$ python -i special_method.py >>> do() @: tips_setattr -- __setattr__(...) ... >>>
■ 各項目を実行する
各ステップの「動作」を確認するには、関数 do に実引数を指定します。
>>> do(@) >>> # -------------------------------------------------- tips_setattr >>> s = Tips(); s.a AttributeError: 'Tips' object has no attribute 'a' >>> s.a = "A" #1: >>> s.a 'A' >>> s.a = "@" #2: >>> s.a '@' >>> s = Tips(); s.a AttributeError: 'Tips' object has no attribute 'a' >>> s.a = "A" #3: >>> s.a 'A' >>> s.a = "@" #4: ValueError: x.name = value should isalpha >>> s.a 'A'
事例:コードの解説
■ 未定義の属性を参照する
メソッド __setattr__ を定義する/しないとは関係なく、次のように
>>> s = Tips(); s.a AttributeError: 'Tips' object has no attribute 'a'
属性値を設定する前は、例外 AttributeError を生成して、エラーメッセージが出力されます。
■ メソッド __setattr__ を定義しない
class Tips(object): pass
メソッド __setattr__ を定義しないと、次のように
>>> s.a = "A" #1: >>> s.a 'A' >>> s.a = "@" #2: >>> s.a '@'
任意の属性値を設定できます。
■ メソッド __setattr__ を定義する
class Tips(object): def __setattr__(self, key, value): if value.isalpha(): self.__dict__[key] = value else: raise ValueError("x.name = value should isalpha")
メソッド __setattr__ を定義すると、次のように
>>> s.a = "A" #3: >>> s.a 'A' >>> s.a = "@" #4: ValueError: x.name = value should isalpha >>> s.a 'A'
属性値として、英字からなる文字列だけを設定できます。
》こちらに移動中です《
↑TOP