pythonでのプライベート属性の操作:propertyの使用


Pythonでメソッドを与えるのは,属性を私有化するためであり,1つはパッケージング性のためである.二つ目はプログラムの安全性のためです.pythonでは__を使用できますプライベート属性を定義します.プライベート属性クラス外とサブクラスは直接操作してアクセスできませんが、実際の開発ではプライベート属性も変わらないわけではありません.したがって、プライベート属性に外部で操作できる方法を提供します.
1.property属性の定義と使用
propertyの使い方は、実は方法にアクセサリーを適用し、方法に@propertyを追加する方法です.具体的にはどんな装飾器か後で紹介します.実装機能とは、クラスに値がpropertyオブジェクトとして定義されるクラス属性であり、言い換えれば、メソッドをクラス属性にカプセル化し、クラス属性を呼び出す方式で呼び出す方法であり、property自体にもメソッドがある.
2.propertyはjavaのgetter/setterのようにクラスのプライベート属性を操作します.
一般的にプログラムのセキュリティのためにカプセル化される理由でpythonにはプライベート属性があり、直接アクセスできないため、このとき彼を操作すると、対応するgetter/setterメソッドを提供するクラスが必要になります.
2.1.カスタムget,setメソッドにより,メソッドを呼び出す形式でプライベート属性を操作する
#1.     get,set  ,                 
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    #        get  ,      
    def getAge(self):
        return self.__age

    #             set  ,      
    def setAge(self,age):
        self.__age = age

person1 = Person("tom",19)
person1.setAge(20)
print(person1.name,person1.getAge())  #tom 20


2.propertyプロパティを呼び出してset,getメソッドをカプセル化した.次にプライベート属性を操作します
#2.    property   set,get       。        
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    #        get  ,      
    def getAge(self):
        return self.__age

    #             set  ,      
    def setAge(self,age):
        self.__age = age

    p = property(getAge,setAge) #    getAge,setAge   ()

s1 = Student("jack",22)
s1.p = 23 #    =,       ,  setAge  。
print(s1.name,s1.p)  #jack 23   ,    s1.p        ,  getAge
print(s1.name,s1.getAge()) #jack 23,    set,get        。

絶叫のヒント:propertyメソッドには4つのパラメータがあります.
  • 1番目のパラメータはメソッド名、呼び出しオブジェクトである.属性時に自動的に実行メソッドをトリガし、以下のgetterメソッドに対応
  • 2番目のパラメータはメソッド名、呼び出し対象である.属性=XXX時自動トリガ実行方法、以下のsetter方法に対応
  • 3番目のパラメータはメソッド名であり、delオブジェクトを呼び出す.属性時自動トリガ実行方法、以下のdeleterメソッドに対応
  • 4番目のパラメータは文字列である、呼び出し対象である.属性._doc__ ,このパラメータはこの属性の記述情報
  •  3.propertyを直接使用して同名関数の形式を寸法します.これは最終開発でよく使われる方法です.
    #3.         ,    property         。            。
    class Teacher(object):
        def __init__(self, name, age,speak):
            self.name = name
            self.__age = age
            self.__speak = speak
    
    
        @property      #  1.@proterty       get  ,     set   。
        def age(self):
            return self.__age
    
        @age.setter    #  2.           .setter,  property.setter.
        def age(self,age):
            if age > 150 and age <=0:  #    setter         
                print("      ")
            else:
                self.__age = age
    
        @property
        def for_speak(self):  #  2.              ,           。
            return self.__speak
    
        @for_speak.setter
        def for_speak(self, speak):
            self.__speak = speak
        
        
    
    t1 = Teacher("herry",45,"Chinese")
    t1.age = 38    #  4.  property ,    t1.age,   t1.age()   。
    t1.for_speak = "English"  
    
    print(t1.name,t1.age,t1.for_speak)  #herry 38 English

    絶叫のヒント:
  • .@property属性関数となり、setterメソッドに判断条件をフィルタするなど、属性付与時に必要なチェックを行うことができます.さらに、カスタムgetメソッドとsetメソッドに比べて、propertyはコードの短さと精悍さを保証し、プライベート属性の操作コードのフォーマットをモジュール化します.
  • @propertyはパラメータselfが1つしかなく、戻り値が必要なので、属性のgetメソッドを一般的に定義します.
  • 注意@property呼び出し方式は、括弧ではなく属性名を直接呼び出せばよい.

  • 3.propertyの方法の使用
  • @property装飾メソッドの場合、メソッドはクラスのプロパティの形式として呼び出すことができ、操作メソッドは操作インスタンスのプロパティが同じである場合.
  • pythonのクラスは のproperty属性が のproperty属性より豊富である.(クラスがobjectに続く場合、クラスは新式クラス)であるが、Python 3.xではクラシッククラスがキャンセルされ、デフォルトは新しいクラスであり、objectを明示的に継承する必要はないため、python 3を使用する場合はこの問題はありません.python 2の新しいクラスと古典的なクラスpropertyでは、メソッドの数が異なります.
  • #coding=utf-8
    # ###############    ###############
    class Goods:
        """python3     object 
             python2、3          ,     python3   @xxx.setter  @xxx.deleter
        """
        @property
        def price(self):
            print('@property')
    
        @price.setter #     price.setter,   property.setter
        def price(self, value):
            print('@price.setter')
    
        @price.deleter
        def price(self):
            print('@price.deleter')
    
    # ###############    ###############
    obj = Goods()
    obj.price          #@property,      @property     price   ,         
    obj.price = 123    #@price.setter,     @price.setter     price   ,  123        
    del obj.price      #@price.deleter      @price.deleter     price   ,         del obj.price
    
    

    絶叫のヒント:
  • クラシッククラスの属性は1つのアクセス方式のみであり、@propertyによって修飾される方法に対応する
  • 新式クラスの属性には3種類のアクセス方式があり、それぞれ被@property、@メソッド名が3つ対応する.setter,@メソッド名.deleter修飾の仕方
  • 新しいクラスには3つのアクセス方法があるため、これらのいくつかのプロパティのアクセス特徴に基づいて、同じプロパティの取得、変更、削除の3つのメソッドをそれぞれ定義できます.
    class Goods(object):
    
        def __init__(self):
            #   
            self.original_price = 100
            #   
            self.discount = 0.8
    
        @property
        def price(self):
            #      =    *   
            new_price = self.original_price * self.discount
            return new_price
    
        @price.setter
        def price(self, value):
            self.original_price = value  #          original_price
    
        @price.deleter  #    deleter                  del       ,         。
        def price(self):
            del self.original_price  #             。
    obj = Goods()
    print(obj.price)         #       ,80
    obj.price = 200   #       ,160
    print(obj.price)   #160
    print(obj.original_price) #200
    del obj.price     #       ,  original_price      ,         。
    print(obj.price)  #AttributeError: 'Goods' object has no attribute 'original_price'

    統一声明:オリジナルブログの内容については、一部の内容がインターネットから参照されている可能性があります.オリジナルリンクがあれば参照を宣言します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.ブログの転載については、オリジナルリンクがあれば声明します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.