python的屬性(property)使用

在面向對象編程的時候,咱們定義一個Personjava

class Person:
  def __init__(self):
      self.age = 22

這樣寫法可以方便的訪問屬性age,python

p = Person()
print p.age ==>22
p.age = 30
print p.age ==>30

這樣寫起來雖然很簡單,可是沒有參數檢驗(eg,輸入非數值,輸入過大的數值)。
寫過Java的人知道,在Java有一種類叫作實體類(entity,javabean等),它們通常不提供其餘複雜的方法只提供簡單的gettersetter等方法。以下例子編程

public class person{ 
private int age; 
 public String getAge()
{
     return this.age;
 } 
 public String setAge(String age)
{ 
    if(age > 100) {}//數值檢驗
     return this.age=age; 
 }
 }

同理咱們能夠按照這個思路來編寫python代碼this

class Person:
  def __init__(self):
      self.age = None
  def get_age(self):
      return self.age
  def set_age(self,age):
      if not isinstance(age, int):
            raise ValueError('age must be an integer!')
      if age < 0 or age > 100:
            raise ValueError('age must between 0 ~ 100!')
      self.age = age

這樣寫就完善不少,參數不會被隨意更改了。訪問age的時候須要使用p.get_age(),但這種寫法不夠pythonic,強大的python提供了@property方法,方法以下code

class Person(object):
  def __init__(self):
      self._age = None
  @property
  def age(self):
      return self._age
  @age.setter
  def age(self,_age):
      if not isinstance(_age, int):
            raise ValueError('age must be an integer!')
      if _age < 0 or _age > 100:
            raise ValueError('age must between 0 ~ 100!')
      self._age = _age
p=Person()

這裏面有一點須要注意,就是在自定義類的時候須要使用新式類,即繼承了object對象

相關文章
相關標籤/搜索