Python中@propertyの使い方詳細

3661 ワード

結合属性の場合、直接に属性をオブジェクトに割り当てます。

p = Person()
p.name= 'Mary'
まず詳細な例を見ます。

class Person(object):
  def __init__(self, name, age):
    self.__name = name
    self.__age = age

  def get_age_fun(self):
     return self.__age

  def set_age_fun(self, value):
    if not isinstance(value, int):
      raise ValueError('       !')
    if value < 0 or value > 100:
      raise ValueError('     0-100')
    self.__age = value

  def print_info(self):
    print('%s: %s' % (self.__name, self.__age))


p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun()) # 20     ,    “  ”    __age   17,      __age   class   __age        !
#    __age     Python        _Person_age,      p     __age  。      get_age_fun       

p.set_age_fun(35)
print(p.get_age_fun()) # 35

print(p.print_info()) # balala: 35
出力:
17
20
35
balala:35
表面的には、外部コードが“成功”に設定されています。age変数17は、実はこれです。age変数とクラス内部の_age変数は変数ではありません。
内部の_age変数はPython解釈器によって自動的に変更されました。Person_外部コードはpに_を追加しました。変数だからget_を呼び出しますage_fun出力は初期値20です。
そしてset_age_funはclass内部でage変数値を変更したので、最終的にbala:35を出力します。
私たちはもう少し調整します。
(変数名は一つしか変更されていません。元のプライベート属性です。age単下線は:_メッセージは、「age」と定義することもできる。
下線で始まる変数名の例を説明します。たとえば、_このような例示的変数は外部からアクセスできますが、約俗的に規定されています。このような変数を見ると、「訪問できますが、プライベート変数と見なして、勝手にアクセスしないでください。」という意味です。

class Person(object):
  def __init__(self, name, age):
    self.__name = name
    self._age = age

  def get_age_fun(self):
     return self._age

  def set_age_fun(self, value):
    if not isinstance(value, int):
      raise ValueError('       !')
    if value < 0 or value > 100:
      raise ValueError('     0-100')
    self._age = value

  def print_info(self):
    print('%s: %s' % (self.__name, self._age))


p = Person('balala',20)
p._age = 17
print(p._age) # 17
print(p.get_age_fun()) #    17     20,    _age     ,              

p.set_age_fun(35)
print(p.get_age_fun()) # 35

print(p.print_info()) # balala: 35

出力:
1 17
2 17
3 35
4 balalala:35
ビューのプライベートと全体の設定
しかし、上記の呼び方はやや複雑ではないかと思いますが、直接属性を使うということはないです。
類似の属性のような簡単な方法でクラスにアクセスできる変数がありますか?必要な方法
まず、ちょっと改造した例を見てみます。(後でPython内蔵の@property装飾器を使って、一つの方法を属性呼出しに変えます。)
本題に入ります。@propertyのいいところを見てください。

class Person(object):
  def __init__(self, name, age):
    self.__name = name
    self.__age = age

  @property
  def get_age_fun(self):
     return self.__age

  @get_age_fun.setter # get_age_fun        
  def set_age_fun(self, value):
    if not isinstance(value, int):
      raise ValueError('       !')
    if value < 0 or value > 100:
      raise ValueError('     0-100')
    self.__age = value

  def print_info(self):
    print('%s: %s' % (self.__name, self.__age))


p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun) # 20       ()

#p.set_age_fun(35)            
p.set_age_fun = 35 #   set_age_fun           ()
print(p.get_age_fun) # 35
print(p.print_info()) # balala: 35
出力:
17
20
35
balala:35
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。