亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python property函數如何定義屬性

發布時間:2020-09-23 16:02:05 來源:億速云 閱讀:142 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關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函數如何定義屬性就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太保市| 涪陵区| 翁源县| 西充县| 蓝田县| 田阳县| 岳普湖县| 巩义市| 剑川县| 杭锦后旗| 宜良县| 土默特左旗| 会同县| 玛曲县| 马公市| 长白| 南涧| 武川县| 兰坪| 克拉玛依市| 界首市| 玉山县| 铅山县| 永年县| 荣昌县| 沾化县| 项城市| 台安县| 黔江区| 来安县| 汶川县| 黄石市| 米脂县| 襄垣县| 谢通门县| 临澧县| 淄博市| 林芝县| 鄂托克旗| 内黄县| 玉溪市|