Python Language 単純な記述子


ディスクリプタには2種類の種類があります。データ記述子は、 __get__() __set__()メソッドと__set__()メソッドの両方を定義するオブジェクトとして定義されますが、非データ記述子は__get__()メソッドのみを定義します。この区別は、オーバーライドとインスタンス辞書の名前空間を考慮する場合に重要です。データ記述子とインスタンス辞書のエントリが同じ名前を共有する場合は、データ記述子が優先されます。ただし、非データ記述子とインスタンス辞書のエントリが同じ名前を共有する場合、インスタンス辞書のエントリが優先されます。

呼び出されたときにはAttributeErrorを上げるセット ()の両方を取得 ()とset()を定義し、読み取り専用のデータ記述子を作成するには。例外を発生させるplaceholderを持つset ()メソッドを定義するだけで、データ記述子にすることができます。

descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None

実装された例:

class DescPrinter(object):
    """A data descriptor that logs activity."""
    _val = 7
    
    def __get__(self, obj, objtype=None):
        print('Getting ...')
        return self._val

    def __set__(self, obj, val):
        print('Setting', val)
        self._val = val
    
    def __delete__(self, obj):
        print('Deleting ...')
        del self._val


class Foo():
    x = DescPrinter()       

i = Foo()
i.x
# Getting ...
# 7

i.x = 100
# Setting 100
i.x
# Getting ...
# 100

del i.x
# Deleting ...
i.x
# Getting ...
# 7