創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設、扶溝網(wǎng)站維護、網(wǎng)站推廣。這篇文章將為大家詳細講解有關Python property函數(shù)如何定義屬性,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
如果為 Python 類定義了 getter、setter 等訪問器方法,則可使用 property() 函數(shù)將它們定義成屬性(相當于實例變量)。
property() 函數(shù)的語法格式如下:
property(fget=None, fset=None, fdel=None, doc=None)
從上面的語法格式可以看出,在使用 property() 函數(shù)時,可傳入 4 個參數(shù),分別代表 getter 方法、setter 方法、del 方法和 doc,其中 doc 是一個文檔字符串,用于說明該屬性。
當然,開發(fā)者調用 property 也可傳入 0 個(既不能讀,也不能寫的屬性)、1 個(只讀屬性)、2 個(讀寫屬性)、3 個(讀寫屬性,也可刪除)和 4 個(讀寫屬性,也可刪除,包含文檔說明)參數(shù)。
例如,如下程序定義了一個 Rectangle 類,該類使用 property() 函數(shù)定義了一個 size 屬性:
class Rectangle: # 定義構造方法 def __init__(self, width, height): self.width = width self.height = height # 定義setsize()函數(shù) def setsize (self , size): self.width, self.height = size # 定義getsize()函數(shù) def getsize (self): return self.width, self.height # 定義getsize()函數(shù) def delsize (self): self.width, self.height = 0, 0 # 使用property定義屬性 size = property(getsize, setsize, delsize, '用于描述矩形大小的屬性') # 訪問size屬性的說明文檔 print(Rectangle.size.__doc__) # 通過內置的help()函數(shù)查看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() 函數(shù)定義了一個 size 屬性,在定義該屬性時一共傳入了 4 個參數(shù),這意味著該屬性可讀、可寫、可刪除,也有說明文檔。所以,該程序嘗試對 Rectangle 對象的 size 屬性進行讀、寫、刪除操作,其實這種讀、寫、刪除操作分別被委托給 getsize()、setsize() 和 delsize() 方法來實現(xiàn)。
運行上面程序,將會看到如下輸出結果:
用于描述矩形大小的屬性 Help on property: 用于描述矩形大小的屬性 (4, 3) 9 7 0 0
在使用 property() 函數(shù)定義屬性時,也可根據(jù)需要只傳入少量的參數(shù)。例如,如下代碼使用 property() 函數(shù)定義了一個讀寫屬性,該屬性不能刪除:
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()函數(shù)定義fullname屬性,只傳入2個參數(shù) # 該屬性是一個讀寫屬性,但不能刪除 fullname = property(getfullname, setfullname) u = User('悟空', '孫') # 訪問fullname屬性 print(u.fullname) # 對fullname屬性賦值 u.fullname = '八戒,朱' print(u.first) print(u.last)
此程序中使用 property() 定義了 fullname 屬性,該程序使用 property() 函數(shù)時只傳入兩個參數(shù),分別作為 getter 和 setter方法,因此該屬性是一個讀寫屬性,不能刪除。
運行上面程序,將看到如下輸出結果:
悟空,孫 八戒 朱
在某些編程語言中,類似于這種 property 合成的屬性被稱為計算屬性。這種屬性并不真正存儲任何狀態(tài),它的值其實是通過某種算法計算得到的。當程序對該屬性賦值時,被賦的值也會被存儲到其他實例變量中。
還可使用 @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函數(shù)如何定義屬性就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)頁名稱:Pythonproperty函數(shù)如何定義屬性-創(chuàng)新互聯(lián)
當前鏈接:http://www.rwnh.cn/article30/cseppo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、做網(wǎng)站、域名注冊、靜態(tài)網(wǎng)站、微信小程序、App設計
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)