在面向對象編程的時候,咱們定義一個Person
類java
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等),它們通常不提供其餘複雜的方法只提供簡單的getter
和setter
等方法。以下例子編程
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
對象