Pythonの記述子


3つの質問に答えます.説明は何ですか.どのように実現しますか?シーンを使用しますか?
一、記述子とは
記述子は、記述子プロトコルのメソッドによって上書きされるバインド動作を持つオブジェクト属性です.これらの方法は、__get____set__、および__delete__である.これらのメソッドのいずれかがオブジェクトに対して定義されている場合、記述子とみなされます.__get__は、属性にアクセスするために使用されます.属性の値を返すか、要求された属性が存在しない場合にAttributeErrorの例外が発生します.__set__は、属性割り当て操作において呼び出される.何も返さない__delete__は削除操作を制御する.コンテンツは返されません
二、記述子の実現方式
2.1クラスベースの作成
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'

class Descriptor(object):
    """"""

    def __init__(self):
        self._name = ''

    def __get__(self, instance, owner):
        print("__get__")
        return self._name

    def __set__(self, instance, value):
        print("__set__")
        self._name = value

    def __delete__(self, instance):
        print("__delete__")
        del self._name


class Person(object):
    name = Descriptor()
    

p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)

2.2 propety()関数の使用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'

class Person(object):
    def __init__(self):
        self._name = ''

    def fget(self):
        print("Getting: %s" % self._name)
        return self._name

    def fset(self, value):
        print("Setting: %s" % value)
        self._name = value.title()

    def fdel(self):
        print("Deleting: %s" % self._name)
        del self._name

    name = property(fget, fset, fdel, "I'm the property.")


p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)

2.3@property装飾器の使用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'

class Person(object):
    """"""

    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        print("get_name")
        return self._name

    @name.setter
    def name(self, value):
        print("set_name")
        self._name = value

    @name.deleter
    def name(self):
        print("del_name")
        del self._name
    

p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)

三、記述子の使用シーン
  • 記述子の使用を組み合わせることで、優雅なプログラミングを実現することができ、SettersとGetters、および読み取り専用属性
  • を作成することができる.
  • 値またはタイプ要求に従って属性検証
  • を行う.
  • は、Djangoのmodels
  • のような様々なフレームワークに多く使用されている.