Pythonのプロパティ_getterとsetterメソッドPython_getterとsetterメソッドを[オン]

Python_getterとsetterメソッド

 

プロパティに割り当てられた場合には、使用实例.属性=属性值方法は、プロパティが明確に露出しており、プロパティ値の検査を制限することができない、Javaはセッターとゲッターメソッドを提供し、その後、Pythonはそれを行う方法ですか?:詳細については、を参照してくださいPythonの研究ガイド

プロパティの割り当て方法

場合は、バウンドプロパティ、しかし、あなたは簡単に結果を変えることができるというパラメータをチェックする方法を記述していないことは非常にシンプルですが、我々は、公開されたプロパティに直接行けば:

s = Student()
s.score = 9999

上記の割り当てはで、スコアの範囲を制限するために、明確に実際の状況と矛盾しているset_score()セットスコア法、およびその後によるget_score()に、そう、結果を得るためにset_score()あなたがパラメータをチェックすることができます方法:

class Student(object):

    def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value

さて、学生の操作のいずれかのインスタンスの任意のスコアを設定することはできません。

>>>s = Student()
>>>s.set_score(60)
>>>s.get_score()
60
>>>s.set_score(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

しかし、上記のメソッド呼び出しと少しはそう簡単なプロパティを直接ではなく、複雑。

両方のパラメータをチェックして、変数は、そのような簡単な方法と同様のクラス属性にアクセスすることができます何もありませんか?完璧なPythonプログラマの追求のために、何をする必要があります!

機能に機能を追加することができますデコレータ(secorator)を覚えていますか?クラスのメソッド、デコレータとしての役割のために。Pythonの組み込み@propertyプロパティは、メソッド呼び出しになるのデコレータは、責任があります:

class Student(object):
 @property def score(self): return self.__score  @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!!!') if value < 0 or value > 100: raise ValueError('score must between 0~100!!!') self.__score = score

@property使用方法では、より複雑な、見てみましょうの実現。プロパティのゲッターメソッドになるためには、単に追加し@property、この時点でそれを@property順番に別のデコレータを作成した@score.setter、setterメソッドになるために属性を割り当てるための責任があるので、我々はプロパティコントロールの動作を持っています。

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score() 60 >>> s.score = 9999 Traceback (most recent call last): ... ValueError: score must between 0 ~ 100! 

この魔法のことに注意してください@property、例えば、私たちが動作しているとき、私たちが達成するために、このプロパティは、おそらく直接公開されていないことを知っているが、getterメソッドとsetterメソッドを介して。

あなただけのgetterメソッドを定義し、読み取り専用属性を定義することができ、setterメソッドを定義していないと、読み取り専用のプロパティは次のとおりです。

class Student(object):

 @property def birth(self): return self._birth  @birth.setter def birth(self, value): self._birth = value  @property def age(self): return 2015 - self._birth

上記birth読み書きプロパティであり、そしてageため、読み取り専用プロパティであるageによるとbirth、現在時刻を算出します。

概要

@property広くパラメータに必要なチェックを確保しながら、プログラムが実行されているように、エラーの可能性を低減する、発信者がショートコードを記述することができ、クラスの定義に使用されます。

クラスパーソン(オブジェクト):
 デフ __init__ (自己、年齢):
self.age = 年齢

@property 
defの年齢(自己):
 リターンself._age 

@ age.setter 
デフ年齢(自己、年齢):
self._age = 年齢

@property 
デフ誕生(自己):
 リターン 2017- self._ageの

P =人(20  >>> 印刷(p.age)
 >>> 印刷(p.birth)

 >>> = 1997 p.birth 
属性エラー#の誕生不存在セッター方法

 

 

からの振替

https://www.cnblogs.com/mzc1997/p/7663052.html

https://www.cnblogs.com/miqi1992/p/8343234.html

プロパティに割り当てられた場合には、使用实例.属性=属性值方法は、プロパティが明確に露出しており、プロパティ値の検査を制限することができない、Javaはセッターとゲッターメソッドを提供し、その後、Pythonはそれを行う方法ですか?:詳細については、を参照してくださいPythonの研究ガイド

プロパティの割り当て方法

場合は、バウンドプロパティ、しかし、あなたは簡単に結果を変えることができるというパラメータをチェックする方法を記述していないことは非常にシンプルですが、我々は、公開されたプロパティに直接行けば:

s = Student()
s.score = 9999

上記の割り当てはで、スコアの範囲を制限するために、明確に実際の状況と矛盾しているset_score()セットスコア法、およびその後によるget_score()に、そう、結果を得るためにset_score()あなたがパラメータをチェックすることができます方法:

class Student(object):

    def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value

さて、学生の操作のいずれかのインスタンスの任意のスコアを設定することはできません。

>>>s = Student()
>>>s.set_score(60)
>>>s.get_score()
60
>>>s.set_score(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

しかし、上記のメソッド呼び出しと少しはそう簡単なプロパティを直接ではなく、複雑。

両方のパラメータをチェックして、変数は、そのような簡単な方法と同様のクラス属性にアクセスすることができます何もありませんか?完璧なPythonプログラマの追求のために、何をする必要があります!

機能に機能を追加することができますデコレータ(secorator)を覚えていますか?クラスのメソッド、デコレータとしての役割のために。Pythonの組み込み@propertyプロパティは、メソッド呼び出しになるのデコレータは、責任があります:

class Student(object):
 @property def score(self): return self.__score  @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!!!') if value < 0 or value > 100: raise ValueError('score must between 0~100!!!') self.__score = score

@property使用方法では、より複雑な、見てみましょうの実現。プロパティのゲッターメソッドになるためには、単に追加し@property、この時点でそれを@property順番に別のデコレータを作成した@score.setter、setterメソッドになるために属性を割り当てるための責任があるので、我々はプロパティコントロールの動作を持っています。

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score() 60 >>> s.score = 9999 Traceback (most recent call last): ... ValueError: score must between 0 ~ 100! 

この魔法のことに注意してください@property、例えば、私たちが動作しているとき、私たちが達成するために、このプロパティは、おそらく直接公開されていないことを知っているが、getterメソッドとsetterメソッドを介して。

あなただけのgetterメソッドを定義し、読み取り専用属性を定義することができ、setterメソッドを定義していないと、読み取り専用のプロパティは次のとおりです。

class Student(object):

 @property def birth(self): return self._birth  @birth.setter def birth(self, value): self._birth = value  @property def age(self): return 2015 - self._birth

上記birth読み書きプロパティであり、そしてageため、読み取り専用プロパティであるageによるとbirth、現在時刻を算出します。

概要

@property広くパラメータに必要なチェックを確保しながら、プログラムが実行されているように、エラーの可能性を低減する、発信者がショートコードを記述することができ、クラスの定義に使用されます。

おすすめ

転載: www.cnblogs.com/paul8339/p/12150036.html