ゼロベース入門python 3.7-基礎知識総括(20)記述子とproperty()

2760 ワード

一.ディスクリプタ
記述子は簡単にクラスです.ただし、別のクラスのプロパティへのアクセス方法を定義しています.すなわち、クラスは、属性管理権を記述子クラスに委任することができる.
二.ディスクリプタプロトコル
  • __set__(self,obj,type=None)属性設定時にこのメソッド
  • を呼び出す.
  • __get__(self,obj,value)属性の読み出し時にこのメソッド
  • が呼び出される.
  • __delete__(self,obj)属性に対してdelを呼び出すときにこのメソッド
  • を呼び出す.
    属性を検索するたびに.記述子プロトコルのメソッドは、クラスオブジェクトの特殊なメソッドによって記述されます.getattribute__()を呼び出します.すなわちクラスオブジェクトを毎回使用する.属性の呼び出し方式の場合、暗黙的に呼び出されます_getattribute__()は、次の順序で属性を検索します.
  • この属性がクラスインスタンスオブジェクトのデータ記述子
  • であるかどうかを検証する.
  • そうでなければ、その属性がクラスインスタンスオブジェクトの__にあるかどうかを確認します.dict__に表示されます.
  • 最後.この属性がクラスインスタンスオブジェクトの非データ記述子
  • であるかどうかを確認する
    class Person:
      def __init__(self, name=None, age=23):
        self.name = name
        self.age = age
    
      def __get__(self, instance, owner):
        return self.name
    
      def __set__(self, instance, value):
        self.age = value
    
    
    class Person1:
      a = Person('  ', 30)
      b = 100
    
    d = Person1
    print("    __get__  :", d.a)
    d.a = 1000000
    print("        :", d.a)
    
        __get__  :   
            : 1000000

    クラスの属性にデータ記述子がある場合、その属性をクエリするたびに記述子の__が呼び出されることがわかります.get__()メソッドは彼の値を返します.この属性に値を割り当てるたびに__が呼び出されます.set__()メソッド
    さんproperty()関数
    クラスオブジェクトを通過する.属性アクセスクラスで定義された属性.実はこのやり方は妥当ではない.彼はクラスのパッケージ原則を破壊した.通常、クラスに含まれるプロパティは非表示になります.クラスが提供するメソッドによって間接的にクラス属性へのアクセスと操作を実現することのみが許可されます.したがってクラスパッケージの原則を破壊しない上でクラス中の属性を有効に操作できるようにする.クラスには、クラスオブジェクトを介して複数の読み書きgetterメソッドまたはsetterメソッドが含まれるべきである.メソッド(パラメータ)の方法でプロパティを操作します.
    class Person:
      def __init__(self, name):
        self.name = name
    
      def getName(self):
            return self.name
    
      def setName(self, name):
            self.name = name
    
    
    a = Person("  ")
    print(a.getName())
    a.setName("  ")
    print(a.getName())
    
    
      
      
    

    この方式は煩雑すぎるからだ.したがってpythonはproperty()関数を提供します.クラスパッケージを破壊することなく、開発者がクラスオブジェクトをそのまま使用できるようにすることができる.プロパティの方法クラスのプロパティを操作します.
    class Person:
      def __init__(self, name):
        self.__name = name
    
      def getName(self):
            return self.__name
    
      def setName(self, name):
            self.__name = name
    
      def deleteName(self):
            self.__name = '---'
    
      name = property(getName, setName, deleteName, '          name  ')
    
    help(Person.name)
    a = Person("  ")
    #    getName
    print(a.name)
    #   setName
    a.name = "  "
    print(a.name)
    #    deleteName
    del a.name
    print(a.name)
    
    
    
    Help on property:
    
                  name  
    
      
      
    ---

    最初のパラメータは、属性値を読み込む方法を示します.2番目のパラメータは、このプロパティを設定する方法を示します.3番目のパラメータは、属性を削除する方法を示します.4番目のパラメータは関数の説明を表します.また、この4つのパラメータは、1つまたは2つまたは3つまたはすべてを指定することができる.すなわちパラメータの指定は勝手ではない.
    説明が必要なのは.getName()はnameのプロパティを返すためです.selfを使用する場合.nameの言葉.本当はgetName()を呼び出しています.無限ループが現れる.このような状況を避けるために.nameプロパティは、プライベートプロパティに設定する必要があります(詳細は後述).使用するname(下線2本).