最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python知識:裝飾器@property到底有啥用途

 更新時間:2023年01月04日 08:42:55   作者:無水先生  
這篇文章主要介紹了python裝飾器@property到底有啥用途,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、提要

python的@property是python的一種裝飾器,是用來修飾方法的。

python @property 裝飾器使一個方法可以像屬性一樣被使用。

除此之外,還有幾個使用場景,本文將敘述這些使用技巧。

二、關(guān)于屬性的約定

首先看下屬性的分類:

2.1 類綁定屬性

一般類內(nèi)屬性是指定義成與類同一存儲單元的屬性,可以類訪問。

而當類實例化成對象后,類變量將做為拷貝加入對象,對象所訪問的屬性是一份拷貝。

這份拷貝修改后易變。

驗證代碼

class Stranger(object):
    name = 'class name'                #類綁定屬性
    def __init__(self, gender=None ):
        self.gender = gender           #對象綁定屬性
        self.name = 'new name'         #對象中屬性,與類屬性的同名拷貝
 
stan = Stranger('male')
print(1,stan.gender)
stan.gender = 'famel'
print(2,stan.gender)
print(3 stan.name)
print( 4, Stranger.name)

結(jié)果:

1 male
2 famel
3 new name
4 class name

2.2 對象綁定屬性

凡用self定義的屬性,都是對象綁定屬性,

  • 內(nèi)部調(diào)用時都需要加上self.
  • 外部調(diào)用時用 instance_name.property_name進行訪問
class Stranger(object):
    def __init__(self, gender=None ):
        self.gender = gender
 
stan = Stranger('roma')
print(stan.gender)
 
stan.gender = 'Paras'
print(stan.gender)

結(jié)果: 

roma
Paras 

注意:事實上實例化后的對象,也可以定義屬性,外部也可以調(diào)用。 

2.3 私有屬性 

python的私有屬性沒有編譯限定,知識以單下劃線_開頭,標記此屬性是私有的,但是外部也可以自由訪問(私有的程度不夠多)。

另一種是雙下劃線__開頭的屬性,可以轉(zhuǎn)化成類屬性訪問

  • 單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改
  • 雙下劃線__開頭:外部不可通過instancename.propertyname來訪問或者更改,實際將其轉(zhuǎn)化為了_classname__propertyname

三、應(yīng)用@property裝飾器

python的@property是python的一種裝飾器,是用來修飾方法的。python @property 裝飾器使一個方法可以像屬性一樣被使用,而不需要在調(diào)用的時候帶上() 接下來我們會了解什么時候需要使用它,并且在什么場景下需要用到它以及如何合理的使用它。

python類中@property裝飾器,相配合的方法有:

  • setter() 
  • get() 
  • set()

相配合。

3.1 將一個屬性轉(zhuǎn)成方法

將一個屬性轉(zhuǎn)化為一個方法時,我們最好加上一個@property 裝飾器來解決這個問題。

在方法定義上面加一個@property 裝飾器,可以在不改變原有調(diào)用方式的同時,來將一個屬性改為一個方法。

class Goods():
        def __init__(self,unit_price,weight):
            self.unit_price = unit_price
            self.weight = weight
 
        @property
        def price(self):
            return self.unit_price * self.weight 
 
lemons = Goods(7,4)
print(lemons.price)

   28    

 上文中,price是方法,現(xiàn)在將方法轉(zhuǎn)化成屬性調(diào)用。注意這個技巧,要知道原類定義中無price這個屬性,這是一個臨時產(chǎn)生的結(jié)果。類同于excel表格的“計算項”。

3.2 私有化某些屬性

對于某些屬性,不可直接訪問。這里的“直接”就是“無條件”的意思;而條件的訪問,就需要裝飾器 @property,下例是雙裝飾器@property和@age.setter配合,對_age進行條件隔離的例子:

class Stranger(object):
    def __init__(self, gender=None, age=None, job=None):
        self.gender = gender
        self._age = age # 這里的成員屬性_age需要與成員方法age()區(qū)分開
        self.jobb = job
 
    # 讀取age
    @property # 實現(xiàn)一個age相關(guān)的getter方法
    def age(self):
        return self._age
 
    # 設(shè)置age
    @age.setter # 實現(xiàn)一個age相關(guān)的setter方法
    def age(self, value):
        if isinstance(value, int):
            self._age = value
        else:
            raise ValueError("'int' type need")
            
 
if __name__ == "__main__":
    # 創(chuàng)建一個“妹子”
    meizi = Stranger()
 
    meizi.age = 18  # 使用時注意是.age,不是._age
    print("年齡:{age}".format(age=meizi.age))

注意事項:

  • 屬性名與方法名一定要區(qū)分開,不然會進入死循環(huán)(self._age,def age())
  • 實例化的對象使用屬性時,不是調(diào)用屬性(meizi._age),而是用的方法名(meizi.age)
  • @property其實就是實現(xiàn)了getter功能; @xxx.setter實現(xiàn)的是setter功能;還有一個 @xxx.deleter實現(xiàn)刪除功能
  • 定義方法的時候 @property必須在 @xxx.setter之前,且二者修飾的方法名相同(age())
  • 如果只實現(xiàn)了 @property(而沒有實現(xiàn)@xxx.setter),那么該屬性為 只讀屬性

3.3 關(guān)聯(lián)性修改

比如,我們輸入了first_name、last_name可以得出fullname,下面代碼可以實現(xiàn)全名的屬性獲取。而反過來,對全名進行修改后,如何將連帶的first_name、last_name同步進行修改?。

下文中的 @fullname.setter就是解決此類問題的。

class Person():
    def __init__(self, first_name, last_name):
        self.first = first_name
        self.last = last_name
 
    @property
    def fullname(self):
        return self.first + ' ' + self.last
 
    @fullname.setter
    def fullname(self, name):
        first_name, last_name = name.split()
        self.first = first_name
        self.last = last_name
 
    def email(self):
        return '{}.{}@email.com'.format(self.first, self.last)
 
 
person = Person('zhang', 'san')
print(person.fullname)
print(person.last)
print(person.first)
 
person.fullname = 'li si'
print(person.fullname)
print(person.last)
print(person.first)

3.4 刪除屬性的deleter方法

setter 方法類似,當我們需要刪除一個屬性時,我們會使用deleter 方法。

你可以像定義setter 方法一樣來定義一個setter 方法,使用相同的方法名,并在方法上添加@{methodname}.deleter 裝飾器 。

class Person():
    def __init__(self, first_name, last_name):
        self.first = first_name
        self.last = last_name
 
    @property
    def fullname(self):
        return self.first + ' ' + self.last
 
    @fullname.setter
    def fullname(self, name):
        first_name, last_name = name.split()
        self.first = first_name
        self.last = last_name
 
    @fullname.deleter
    def fullname(self):
        self.first = None
        self.last = None
 
    def email(self):
        return '{}.{}@email.com'.format(self.first, self.last)
 
 
person = Person('zhang', 'san')
print(person.fullname)
print(person.last)
print(person.first)
 
del person.fullname
 
print(person.last)
print(person.first)

四、property()函數(shù)原理

使用該函數(shù)可以將方法直接變成屬性,與@property類同。

函數(shù)接口:

property(fget=None, fset=None, fdel=None, doc=None)

使用property的代碼示例:

class Stranger(object):
    def __init__(self, gender=None, age=None, job=None):
        self.gender = gender
        self._age = age
        self.jobb = job
 
    # 設(shè)置_age
    def set_age(self, age):
        if isinstance(age, int):
            self._age = age
        else:
            raise ValueError("'int' type need")
 
    # 讀取_age
    def get_age(self):
        return self._age
    
    # 使得實例化對象可以利用.age方式來訪問
    age = property(get_age, set_age)
 
 
if __name__ == "__main__":
    # 創(chuàng)建一個“妹子”
    meizi = Stranger()
 
    meizi.age = 18
    print("年齡:{age}".format(age=meizi.age))

# 輸出:
#年齡:18

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3.6+Django2.0以上 xadmin站點的配置和使用教程圖解

    Python3.6+Django2.0以上 xadmin站點的配置和使用教程圖解

    django自帶的admin站點雖然功能強大,但是界面不是很好看。這篇文章主要介紹了Python3.6+Django2.0以上 xadmin站點的配置和使用 ,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Python獲取列表值的方法小結(jié)

    Python獲取列表值的方法小結(jié)

    在?Python?編程中,列表(list)是一種非常常見且強大的數(shù)據(jù)結(jié)構(gòu),本文將通過簡潔明了的方式,結(jié)合代碼和案例,介紹如何獲取列表中的值,需要的可以了解下
    2024-11-11
  • Python數(shù)據(jù)集切分實例

    Python數(shù)據(jù)集切分實例

    今天小編就為大家分享一篇Python數(shù)據(jù)集切分實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python析構(gòu)函數(shù)__del__定義原理解析

    Python析構(gòu)函數(shù)__del__定義原理解析

    這篇文章主要介紹了Python析構(gòu)函數(shù)__del__定義原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 動態(tài)設(shè)置django的model field的默認值操作步驟

    動態(tài)設(shè)置django的model field的默認值操作步驟

    這篇文章主要介紹了動態(tài)設(shè)置django的model field的默認值操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 12個Python程序員面試必備問題與答案(小結(jié))

    12個Python程序員面試必備問題與答案(小結(jié))

    這篇文章主要介紹了12個Python程序員面試必備問題與答案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • VSCode配置Anaconda Python環(huán)境的實現(xiàn)

    VSCode配置Anaconda Python環(huán)境的實現(xiàn)

    VisualStudioCode中可以使用Anaconda環(huán)境進行Python開發(fā),本文主要介紹了VSCode配置Anaconda Python環(huán)境的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • VScode連接遠程服務(wù)器上的jupyter notebook的實現(xiàn)

    VScode連接遠程服務(wù)器上的jupyter notebook的實現(xiàn)

    這篇文章主要介紹了VScode連接遠程服務(wù)器上的jupyter notebook的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python?海象運算符(?:=)的三種用法

    Python?海象運算符(?:=)的三種用法

    這篇文章主要介紹了Python?海象運算符(:=)的三種用法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 熵值法原理及Python實現(xiàn)的示例詳解

    熵值法原理及Python實現(xiàn)的示例詳解

    熵值法也稱熵權(quán)法,是學術(shù)研究及實際應(yīng)用中的一種常用且有效的編制指標的方法。本文就來和大家聊聊熵值法原理及Python實現(xiàn),感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02

最新評論

隆化县| 龙陵县| 东城区| 阿合奇县| 华蓥市| 拉萨市| 灵山县| 三亚市| 武安市| 海林市| 威信县| 石泉县| 长汀县| 大新县| 临夏市| 神农架林区| 鄂尔多斯市| 天等县| 西峡县| 甘洛县| 巩义市| 井冈山市| 克什克腾旗| 清新县| 阳信县| 亳州市| 环江| 墨玉县| 松潘县| 富裕县| 胶州市| 长沙县| 郓城县| 乐山市| 卓资县| 沙洋县| 调兵山市| 高青县| 云梦县| 衡阳县| 尼木县|