Python中操作屬性(添加,修改,刪除)的方法歸納

Python中操作屬性值的辦法有很多,我將通過四個實例來循序漸進的說明。

正文:

我們通常要對屬性進行獲取(getter),修改(setter),刪除(deleter)這些操作,比如最簡單的可以這樣實現:

### 實例1 ###class Student(object): passstudent = Student() # 實例化對象student.name = Li # 添加/設置 name屬性student.name = Hu # 修改name屬性student.name # 取name屬性Hudel student.name # 刪除name屬性

我們在實例化student對象後,的確很方便的為實例添加了屬性,但是問題來了。很多時候我們是不希望一個對象的屬性被隨意修改的,而且我們希望對象的屬性值是有效的,但是通過上面方法,屬性可能接收到任意值。也就是說,我們有時需要對屬性的操作進行限制來避免獲取錯誤的屬性值!

為了對屬性的操作進行限制,得到希望的屬性值,我們可以在定義類的時候添加一些方法:

### 實例2 ###class Student(object): def __init__(self): self._name = None def get_name(self): # 取屬性 return self._name def set_name(self, n): # 修改/設置 屬性 if not isinstance(n, str): # 如果傳入的不是字元串 拋出一個異常 可以避免屬性接受非字元串對象 raise TypeError(Name must be str!) # raise表達式用於拋出一個異常 self._name = nstudent = Student()student.set_name(li) # 正確的設置屬性student.get_name() # 訪問屬性listudent.set_name(123) # 錯誤的設置屬性TypeError: Name must be str!

這下的確可以限制屬性了,但是對於一個Python程序員來說,這還不夠不優雅( ̄▽ ̄)",因為每次調用方法顯的有些麻煩。觀察上面兩個例子,我們就想:能不能在保證對屬性進行限制的情況下又能像第一個例子中那樣操作屬性呢?Python中的property()函數滿足了我們的要求:

### 實例3 ###class Student(object): def __init__(self): self._name = None def get_name(self): return self._name def set_name(self, value): self._name = value def del_name(self): del self._name x = property(get_name,set_name,del_name,"I am the x property.")student = Student() # 實例化student.x = Li # 相當於 student.set_name(Li)student.x # 相當於 student.get_nameLidel tudent.x # 相當於 del student.name

在上面的代碼中property函數的原型是:property([fget[, fset[, fdel[, doc]]]]),它將返回新式類屬性。當使用student.x = Li,相當於 student.set_name(Li);當使用student.x,相當於 student.get_name;當使用del tudent.x,相當於 del student.name

這下可以了吧?還沒,利用Python中的裝飾器可以讓我們把上述的代碼寫的更加簡單:

### 實例4 ###class Student(object): def __init__(self): self._name = None @property def name(self): # 注意 這三個方法名要一樣 return self._name @name.setter # 注意 裝飾器名改變 def name(self, value): # 注意 這三個方法名要一樣 self._name = value @name.deleter # 注意 裝飾器名改變 def name(self): # 注意 這三個方法名要一樣 del self._namestudent = Student()student.name = Li # 相當於 student.set_name(Li)student.name # 相當於 student.get_nameLidel student.name # 相當於 del student.name

總結:

  • 操作屬性的方法通常包含最基礎的三個:獲取(get),修改(set),刪除(del)。
  • 可以像操作普遍變數一樣操作屬性。這樣雖然方便,但是可能會導致屬性被隨意修改,以及接受一些不正常的值。
  • 為避免屬性被隨意修改,我們可以在定義類時順便定義方法,通過方法實現屬性的獲取、修改和刪除。
  • 在定義類中使用property函數可以使得限制屬性的同時能夠簡單的操作它們。使用@property語句可以進一步簡化代碼。
  • python簡潔設計的風格從操作屬性這樣一個問題中也可見一斑!

推薦閱讀:

Python3 函數裝飾器(002)
es7你都懂了嗎?今天帶你了解es7的神器decorator

TAG:Python | 面向對象編程 | 裝飾器 |