Pythonのproperty装飾器

6786 ワード

他の言語では、例えばJavaとC++は、クラスを実現する時に、getとsetの方法を実現して、プライベート属性の変更を制御して、コードの中で直接使用することを防止します。オペレータは属性値を変えて、予想できないエラーと結果をもたらします。pythonには別のアイデアがあります。これがproperty装飾器です。例えば以下のコード:
class Plane(object):
    """"
          
    """

    def __init__(self):
        self._alive = True
        self._score = 0

    #  alive       ,   p.alive     ,        
    @property
    def alive(self):
        print("   alive  ")
        #   property ,             ,           ,         
        if not self._alive:
            self.cancel_schedule()
        return self._alive

	#        property    setter     ,  python        
    @alive.setter
    def alive(self, value):
        print("   alive.setter  ")
        self._alive = value
        if value == False:
            self.die_action()

	def cancel_schedule(self):
        print('      ')

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if value < 0:
            print("        ")
        else:
            self._score = value
            self._update_score_brand(value)


    def _update_score_brand(self, value):
        print('      :%d' % value)


    def die_action(self):
        print('       ')


p = Plane()
hit = True
if hit:
    tmp = p.alive
    p.score = -10
    print(p.score)
    p.alive = False
上のコードの出力結果は以下の通りです。
   alive  
        
0
   alive.setter  
       
上のコードはC++またはJavaの関数を呼び出すような形でクラスオブジェクトの属性を変更していませんが、実際に効果を発揮したのは私たちがsetとget方法を書いたのと同じです。