pythonでのプライベート属性の操作:propertyの使用
5811 ワード
Pythonでメソッドを与えるのは,属性を私有化するためであり,1つはパッケージング性のためである.二つ目はプログラムの安全性のためです.pythonでは__を使用できますプライベート属性を定義します.プライベート属性クラス外とサブクラスは直接操作してアクセスできませんが、実際の開発ではプライベート属性も変わらないわけではありません.したがって、プライベート属性に外部で操作できる方法を提供します.
1.property属性の定義と使用
propertyの使い方は、実は方法にアクセサリーを適用し、方法に@propertyを追加する方法です.具体的にはどんな装飾器か後で紹介します.実装機能とは、クラスに値がpropertyオブジェクトとして定義されるクラス属性であり、言い換えれば、メソッドをクラス属性にカプセル化し、クラス属性を呼び出す方式で呼び出す方法であり、property自体にもメソッドがある.
2.propertyはjavaのgetter/setterのようにクラスのプライベート属性を操作します.
一般的にプログラムのセキュリティのためにカプセル化される理由でpythonにはプライベート属性があり、直接アクセスできないため、このとき彼を操作すると、対応するgetter/setterメソッドを提供するクラスが必要になります.
2.1.カスタムget,setメソッドにより,メソッドを呼び出す形式でプライベート属性を操作する
2.propertyプロパティを呼び出してset,getメソッドをカプセル化した.次にプライベート属性を操作します
絶叫のヒント:propertyメソッドには4つのパラメータがあります.1番目のパラメータはメソッド名、呼び出しオブジェクトである.属性時に自動的に実行メソッドをトリガし、以下のgetterメソッドに対応 2番目のパラメータはメソッド名、呼び出し対象である.属性=XXX時自動トリガ実行方法、以下のsetter方法に対応 3番目のパラメータはメソッド名であり、delオブジェクトを呼び出す.属性時自動トリガ実行方法、以下のdeleterメソッドに対応 4番目のパラメータは文字列である、呼び出し対象である.属性._doc__ ,このパラメータはこの属性の記述情報 3.propertyを直接使用して同名関数の形式を寸法します.これは最終開発でよく使われる方法です.
絶叫のヒント: @propertyはパラメータselfが1つしかなく、戻り値が必要なので、属性のgetメソッドを一般的に定義します. 注意@property呼び出し方式は、括弧ではなく属性名を直接呼び出せばよい.
3.propertyの方法の使用@property装飾メソッドの場合、メソッドはクラスのプロパティの形式として呼び出すことができ、操作メソッドは操作インスタンスのプロパティが同じである場合. pythonのクラスは
絶叫のヒント:クラシッククラスの属性は1つのアクセス方式のみであり、@propertyによって修飾される方法に対応する 新式クラスの属性には3種類のアクセス方式があり、それぞれ被@property、@メソッド名が3つ対応する.setter,@メソッド名.deleter修飾の仕方 新しいクラスには3つのアクセス方法があるため、これらのいくつかのプロパティのアクセス特徴に基づいて、同じプロパティの取得、変更、削除の3つのメソッドをそれぞれ定義できます.
統一声明:オリジナルブログの内容については、一部の内容がインターネットから参照されている可能性があります.オリジナルリンクがあれば参照を宣言します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.ブログの転載については、オリジナルリンクがあれば声明します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.
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つのパラメータがあります.
#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はコードの短さと精悍さを保証し、プライベート属性の操作コードのフォーマットをモジュール化します.3.propertyの方法の使用
と
、
の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
絶叫のヒント:
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'
統一声明:オリジナルブログの内容については、一部の内容がインターネットから参照されている可能性があります.オリジナルリンクがあれば参照を宣言します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.ブログの転載については、オリジナルリンクがあれば声明します.オリジナルリンクが見つからない場合は、権利侵害がある場合は削除に連絡してください.