您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python property函數如何定義屬性,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
如果為 Python 類定義了 getter、setter 等訪問器方法,則可使用 property() 函數將它們定義成屬性(相當于實例變量)。
property() 函數的語法格式如下:
property(fget=None, fset=None, fdel=None, doc=None)
從上面的語法格式可以看出,在使用 property() 函數時,可傳入 4 個參數,分別代表 getter 方法、setter 方法、del 方法和 doc,其中 doc 是一個文檔字符串,用于說明該屬性。
當然,開發者調用 property 也可傳入 0 個(既不能讀,也不能寫的屬性)、1 個(只讀屬性)、2 個(讀寫屬性)、3 個(讀寫屬性,也可刪除)和 4 個(讀寫屬性,也可刪除,包含文檔說明)參數。
例如,如下程序定義了一個 Rectangle 類,該類使用 property() 函數定義了一個 size 屬性:
class Rectangle: # 定義構造方法 def __init__(self, width, height): self.width = width self.height = height # 定義setsize()函數 def setsize (self , size): self.width, self.height = size # 定義getsize()函數 def getsize (self): return self.width, self.height # 定義getsize()函數 def delsize (self): self.width, self.height = 0, 0 # 使用property定義屬性 size = property(getsize, setsize, delsize, '用于描述矩形大小的屬性') # 訪問size屬性的說明文檔 print(Rectangle.size.__doc__) # 通過內置的help()函數查看Rectangle.size的說明文檔 help(Rectangle.size) rect = Rectangle(4, 3) # 訪問rect的size屬性 print(rect.size) # (4, 3) # 對rect的size屬性賦值 rect.size = 9, 7 # 訪問rect的width、height實例變量 print(rect.width) # 9 print(rect.height) # 7 # 刪除rect的size屬性 del rect.size # 訪問rect的width、height實例變量 print(rect.width) # 0 print(rect.height) # 0
程序中,使用 property() 函數定義了一個 size 屬性,在定義該屬性時一共傳入了 4 個參數,這意味著該屬性可讀、可寫、可刪除,也有說明文檔。所以,該程序嘗試對 Rectangle 對象的 size 屬性進行讀、寫、刪除操作,其實這種讀、寫、刪除操作分別被委托給 getsize()、setsize() 和 delsize() 方法來實現。
運行上面程序,將會看到如下輸出結果:
用于描述矩形大小的屬性 Help on property: 用于描述矩形大小的屬性 (4, 3) 9 7 0 0
在使用 property() 函數定義屬性時,也可根據需要只傳入少量的參數。例如,如下代碼使用 property() 函數定義了一個讀寫屬性,該屬性不能刪除:
class User : def __init__ (self, first, last): self.first = first self.last = last def getfullname(self): return self.first + ',' + self.last def setfullname(self, fullname): first_last = fullname.rsplit(','); self.first = first_last[0] self.last = first_last[1] # 使用property()函數定義fullname屬性,只傳入2個參數 # 該屬性是一個讀寫屬性,但不能刪除 fullname = property(getfullname, setfullname) u = User('悟空', '孫') # 訪問fullname屬性 print(u.fullname) # 對fullname屬性賦值 u.fullname = '八戒,朱' print(u.first) print(u.last)
此程序中使用 property() 定義了 fullname 屬性,該程序使用 property() 函數時只傳入兩個參數,分別作為 getter 和 setter方法,因此該屬性是一個讀寫屬性,不能刪除。
運行上面程序,將看到如下輸出結果:
悟空,孫 八戒 朱
在某些編程語言中,類似于這種 property 合成的屬性被稱為計算屬性。這種屬性并不真正存儲任何狀態,它的值其實是通過某種算法計算得到的。當程序對該屬性賦值時,被賦的值也會被存儲到其他實例變量中。
還可使用 @property 裝飾器來修飾方法,使之成為屬性。例如如下程序:
class Cell: # 使用@property修飾方法,相當于為該屬性設置getter方法 @property def state(self): return self._state # 為state屬性設置setter方法 @state.setter def state(self, value): if 'alive' in value.lower(): self._state = 'alive' else: self._state = 'dead' # 為is_dead屬性設置getter方法 # 只有getter方法屬性是只讀屬性 @property def is_dead(self): return not self._state.lower() == 'alive' c = Cell() # 修改state屬性 c.state = 'Alive' # 訪問state屬性 print(c.state) # 訪問is_dead屬性 print(c.is_dead)
上面程序中第 3 行代碼使用 @property 修飾了 state() 方法,這樣就使得該方法變成了 state 屬性的 getter 方法。如果只有該方法,那么 state 屬性只是一個只讀屬性。
當程序使用 @property 修飾了 state 屬性之后,又多出一個 @state.setter 裝飾器,該裝飾器用于修飾 state 屬性的 setter 方法,如上面程序中第 7 行代碼所示。這樣 state 屬性就有了 getter 和 setter 方法,state 屬性就變成了讀寫屬性。
程序中第 15 行代碼使用 @property 修飾了 is_dead 方法,該方法就會變成 is_dead 屬性的 getter 方法。此處同樣會多出一個 @is_dead.setter 裝飾器,但程序并未使用該裝飾器修飾 setter 方法,因此 is_dead 屬性只是一個只讀屬性。
運行上面程序,將看到如下輸出結果:
alive False
關于Python property函數如何定義屬性就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。