ディスクリプタ

ディスクリプタとは

__get__、__set__、__delete__のうちいずれかのメソッドが定義されたオブジェクトをディスクリプタと呼びます。

ディスクリプタをメンバにもつオブジェクトに対し、そのメンバにアクセスしたときの挙動をカスタマイズすることが可能となります。

ディスクリプタそのものに対するアクセス時に__get__、__set__、__delete__が実行されるわけでは無い点に注意してください。

class MyDescriptor:
    """ ディスクリプタクラス """

    def __init__(self, text):
        self.text = text

    def __get__(self, instance, owner):
        return "* " + self.text

    def __set__(self, instance, text):
        self.text = text + "!"

    def __delete__(self, instance):
        del self.text
        print('text属性が削除されました')


class Sample:
    """ 属性にディスクリプタを持つ """
    descriptor = MyDescriptor('sample')
    
obj = Sample()
print(obj.descriptor) # * sample

obj.descriptor = 'sample2'
print(obj.descriptor) # * sample2!

del obj.descriptor # text属性が削除されました
print(obj.descriptor) # AttributeError


ディスクリプタのメソッド

では、一つ一つ確認していきましょう。

__get__

メンバを参照した際の挙動を定義します。

上のサンプルでは、Sampleクラスのdescriptorメンバにアクセスした際に__get__が呼び出されています。

このことにより、アクセスした結果に対し、先頭に*が付加されるようになっています。

__set__

メンバを更新した際の挙動を定義します。

上のサンプルでは、Sampleクラスのdescriptorメンバを更新した際に__set__が呼び出されています。

このことにより、設定した内容に対し、末尾に!が付加されるようになっています。

__delete__

メンバを削除した際の挙動を定義します。

上のサンプルでは、Sampleクラスのdescriptorメンバを削除した際に__delete__が呼び出されています。

このことにより、削除時にメッセージが表示されるようになっています。