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


関連記事

Last updated♪2009/10/28