欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的property及屬性與特性之間的優(yōu)先權(quán)

 更新時(shí)間:2022年07月15日 14:30:10   作者:little亮_  
這篇文章主要介紹了python中的property及屬性與特性之間的優(yōu)先權(quán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

 前言

這幾天看《流暢的python》這本書了,在一個(gè)示例中又看到了property作為裝飾器在使用,因?yàn)楹芫脹](méi)有用這個(gè)東西了,對(duì)它的一些特性和使用方法等都不是很熟悉,所以又專門在搜了幾篇博客和在官方文檔中學(xué)習(xí)了它的相關(guān)用法。再者又剛好學(xué)到了python中的屬性(attribute),所以剛好這兩者可以兩相對(duì)比,也許更好理解!

屬性(attribute)

屬性的定義

在python中,屬性其實(shí)是(對(duì)象的)屬性和(對(duì)象的)方法的集合。

一開(kāi)始我以為就是:屬性就是屬性,方法就是方法,一個(gè)是“屬性”,一個(gè)是行為,但是在打開(kāi)IDE寫了一個(gè)測(cè)試案例后,我就信服了:

# python中數(shù)據(jù)的屬性和處理數(shù)據(jù)的方法統(tǒng)稱為屬性
class Cat:

    def __init__(self, name):
        self.name = name

    def run(self):
        print('小碎步...')

if __name__ == '__main__':
    tom = Cat('Tom')
    print(tom.__getattribute__('name'))  # 對(duì)象的屬性
    print(tom.__getattribute__('run'))  # 對(duì)象的方法

在這里我定義了一個(gè)類,同時(shí)在初始化方法中為它添加了一個(gè)屬性name,然后定義了一個(gè)run方法,之后在main方法里創(chuàng)建了tom這個(gè)實(shí)例,使用__getattribute__()方法來(lái)獲取它的name屬性和run屬性,果不其然,居然真的都獲取到了!

 所以,以后再也不要說(shuō)屬性只是單純的“屬性”了!

屬性的用法

屬性用法很簡(jiǎn)單,不管是對(duì)象的屬性還是方法,都是用.來(lái)獲取或者調(diào)用。

1.設(shè)置或修改對(duì)象的屬性

tom.name='Tom' #設(shè)置(修改)對(duì)象tom的name屬性值為Tom

2.刪除對(duì)象的屬性

del tom.name #使用del關(guān)鍵字刪除對(duì)象的屬性

 可以看到,屬性刪除后就不能再獲取了。

3.調(diào)用對(duì)象的方法(屬性)

tom.run() #直接用.調(diào)用即可

4.對(duì)象的方法置None

對(duì)象的方法我們無(wú)法刪除,但是我們可以將其置為None。

tom.run=None

特性(property)

特性的定義

個(gè)人理解:特性就是屬性的特例,因?yàn)轭A(yù)先知道某些屬性的一些特定條件,比如取值范圍,類型等等,所以在對(duì)這些屬性進(jìn)行操作的時(shí)候,為了在操作前后,保持一些特定條件不變(就是不準(zhǔn)越界操作),所以就有了特性來(lái)約束它。

來(lái)看一下官方文檔給的例子:

官方文檔中提到:一個(gè)典型的例子就是托管x(這里的x是一個(gè)類的屬性), 使用方法也特別的直接明了:如果 c 為 C 的實(shí)例,c.x 將調(diào)用 getter,c.x = value 將調(diào)用 setter, del c.x 將調(diào)用 deleter。就是在對(duì)c.x這個(gè)屬性進(jìn)行操作時(shí),可以通過(guò)getter,setter,delx來(lái)控制它的修改和刪除。

特性的用法

因?yàn)樗且粋€(gè)修飾器,所以調(diào)用方法有兩種:

1.直接使用@符號(hào)調(diào)用

class Dog:
 
    def __init__(self):
        self.__name = None
 
    @property
    def name(self):
        print('調(diào)用了get_name方法...')
        return self.__name
    @name.setter
    def name(self, val):
        print('調(diào)用了set_name方法...')
        self.__name = val
    @name.deleter
    def name(self):
        print('調(diào)用了del_name方法...')
        del self.__name
if __name__ == '__main__':
    tom = Dog()
    tom.name = 'Tom'
    print(tom.name)
    del tom.name

2.當(dāng)做一個(gè)正常的函數(shù)使用

class Cat:
    def __init__(self):
        self.__name = None
    def set_name(self, name):
        print('調(diào)用了set_name方法...')
        self.__name = name
 
    def get_name(self):
        print('調(diào)用了get_name方法...')
 
        return self.__name
 
    def del_name(self):
        print('調(diào)用了del_name方法...')
        del self.__name
    name = property(get_name, set_name, del_name, 'this is a property name.')
if __name__ == '__main__':
    tom = Cat()
    tom.name = 'Tom'
    print(tom.name)
    del tom.name

可以看到兩種方法使用的效果都是一樣的!

特性的使用場(chǎng)景

重點(diǎn)講一下這個(gè),正是因?yàn)橛幸恍┨囟▓?chǎng)景的存在,才會(huì)出現(xiàn)property這個(gè)特性的,正如之前在《Django企業(yè)開(kāi)發(fā)實(shí)戰(zhàn)》一書中所說(shuō)的那樣:若無(wú)必要,勿增實(shí)體。而python向來(lái)以簡(jiǎn)潔優(yōu)雅著稱,因?yàn)檫@些特定場(chǎng)景,所以是有必要增加property這個(gè)實(shí)體的。

主要使用場(chǎng)景有兩個(gè):

1.限制一些屬性為只讀

 在只使用@property修飾某個(gè)方法后,將其變成特定的屬性,如果不添加setter和deleter方法,那么它就變成了只讀屬性。比如:用戶名設(shè)置后就不允許修改:

class User:

    def __init__(self, username, password):
        self.__username = username
        self.password = password

    # 將username屬性限定為只讀
    @property
    def username(self):
        return self.__username
if __name__ == '__main__':
    tom=User('tom','1234')
    print(tom.username)
    tom.username='Tom'

可以看到在只讀狀態(tài)下,修改和刪除屬性都會(huì)失??!

2.限定屬性的操作范圍

生活中,你可能會(huì)遇到這樣的情況,有一天你告訴你媽你想吃魚(yú),并且是紅燒魚(yú)而不是清蒸魚(yú),然后你媽命令你爸去買魚(yú),同時(shí)你媽囑咐你爸說(shuō):買新鮮一點(diǎn)的啊,價(jià)格貴一點(diǎn)沒(méi)關(guān)系!然后你爸心想:這個(gè)月工資還沒(méi)發(fā)呢,能省省就省省吧,于是你爸在心中就大概確定了買一條魚(yú)的開(kāi)銷區(qū)間(比如30到100)??梢钥吹皆谝粭l魚(yú)上餐桌之前,你和你爸媽是對(duì)它進(jìn)行了精挑細(xì)選,才得以上到你的餐桌,其實(shí)就是對(duì)魚(yú)這個(gè)屬性增加了一些條件限定:類型的限定:要紅燒的而不是清蒸的;取值范圍的限定:不能太貴也不能太便宜,30到100之前剛剛好。

接下來(lái)用代碼實(shí)現(xiàn)一下這個(gè)栗子:

class Fish:
 
    def __init__(self):
        self.__price = None
        self.__cook = None
    @property
    def price(self):
        return self.__price
    @price.setter
    def price(self, pri):
 
        if not isinstance(pri, int):
            raise ValueError('價(jià)格有誤!')
        if pri < 30:
            raise ValueError('太便宜了,不要!')
        elif pri > 100:
            raise ValueError('太貴了,不要!')
        else:
            self.__price = pri
            print('價(jià)格剛剛好!')
    @property
    def cook(self):
        return self.__price
 
    @cook.setter
    def cook(self,method):
 
        if method!='紅燒':
            raise ValueError('我只要紅燒魚(yú)!')
        else:
            print('耶,我最愛(ài)的紅燒魚(yú)!')
if __name__ == '__main__':
    luck_fish=Fish()
    luck_fish.price=60
    # luck_fish.cook='清蒸'
    luck_fish.cook='紅燒'

可以看到,只有當(dāng)屬性的取值返回和類型是規(guī)定的范圍之內(nèi)的時(shí)候,程序才會(huì)正常執(zhí)行,而生活中類似這樣的栗子很多,所以這也是特性存在的意義。 

屬性和特性之間的差別和聯(lián)系

直觀的看,特性的目的好像是把方法“屬性化”,但這樣做一點(diǎn)意義也沒(méi)有,如果我可以定義一個(gè)屬性,何必再額外定義一個(gè)方法,然后將其轉(zhuǎn)化成屬性呢?所以,更重要的目的就是應(yīng)對(duì)一些特定場(chǎng)景。

從特性表現(xiàn)出來(lái)的性質(zhì)和行為來(lái)看,它其實(shí)就是一種特定的“屬性”。只不過(guò)特性的權(quán)利提升了一點(diǎn)點(diǎn),就好像你可以去修改這個(gè)屬性,但是能不能修改成功,就看你的上一級(jí)允不允許你修改(有沒(méi)有給你這個(gè)屬性添加限定條件),而特性的權(quán)利就擴(kuò)展到了這個(gè)“上一級(jí)”。

屬性和特性之間的優(yōu)先權(quán)

在寫程序的時(shí)候,也不乏會(huì)出現(xiàn)這樣的例子:屬性和特性之間重名了!那么這個(gè)時(shí)候在使用這個(gè)重名的屬性(特性)時(shí),程序是會(huì)報(bào)錯(cuò)?還是會(huì)使用屬性的值?還是會(huì)使用特性的值?也許根據(jù)它們的名稱就可以猜出來(lái),特性嘛,肯定就特別一些嘛,所以會(huì)優(yōu)先使用特性的值!下面這個(gè)栗子完美說(shuō)明:

# 關(guān)系:在同名的情況下,實(shí)例屬性會(huì)覆蓋類屬性,特性會(huì)覆蓋實(shí)例屬性
 
class Cat:
    @property
    def wow(self):
        return 'property---喵~'
if __name__ == '__main__':
    # 實(shí)例屬性會(huì)覆蓋類屬性
    jerry = Cat()
 
    # 特性會(huì)覆蓋實(shí)例屬性
    print(jerry.__dict__)  # 查看對(duì)象的屬性字典
    jerry.__dict__['wow'] = 'normal---喵~'
    print(jerry.__dict__)
    print(jerry.wow)  # 雖然修改了jerry的wow的值,但是依舊返回的是其特性的值
    print(jerry.__dict__['wow'])
    del Cat.wow  # 刪除類特性后,返回的就是正常的屬性值
    # del Cat.wow  # 刪除特性
    print(jerry.wow)
    Cat.wow = property(lambda self: 'add a property---喵~')  # 為類新增和屬性同名的特性
    print(jerry.wow)  # 之后還是優(yōu)先訪問(wèn)特性的值

到此這篇關(guān)于python中的property及屬性與特性之間的優(yōu)先權(quán)的文章就介紹到這了,更多相關(guān)python property 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Flask接收上傳圖片方法實(shí)現(xiàn)

    Flask接收上傳圖片方法實(shí)現(xiàn)

    本文主要介紹了Flask接收上傳圖片方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python3爬蟲(chóng)中Ajax的用法

    Python3爬蟲(chóng)中Ajax的用法

    在本篇內(nèi)容里小編給大家整理的是關(guān)于Python3爬蟲(chóng)中Ajax的用法,需要的朋友們可以參考下。
    2020-07-07
  • python復(fù)合條件下的字典排序

    python復(fù)合條件下的字典排序

    這篇文章主要介紹了python復(fù)合條件下的字典排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python 實(shí)現(xiàn)Flask中返回圖片流給前端展示

    python 實(shí)現(xiàn)Flask中返回圖片流給前端展示

    今天小編就為大家分享一篇python 實(shí)現(xiàn)Flask中返回圖片流給前端展示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • 利用selenium爬蟲(chóng)抓取數(shù)據(jù)的基礎(chǔ)教程

    利用selenium爬蟲(chóng)抓取數(shù)據(jù)的基礎(chǔ)教程

    這篇文章主要給大家介紹了關(guān)于如何利用selenium爬蟲(chóng)抓取數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用selenium具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • PyQt5+python3+pycharm開(kāi)發(fā)環(huán)境配置教程

    PyQt5+python3+pycharm開(kāi)發(fā)環(huán)境配置教程

    這篇文章主要介紹了PyQt5+python3+pycharm開(kāi)發(fā)環(huán)境配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python?Numpy庫(kù)的超詳細(xì)教程

    Python?Numpy庫(kù)的超詳細(xì)教程

    Numpy庫(kù)是Python中的一個(gè)科學(xué)計(jì)算庫(kù),本文主要介紹了ndarray的基本操作、?ndarray運(yùn)算等各種Numpy庫(kù)的超詳細(xì)教程,需要的朋友可以參考下
    2022-04-04
  • python 串行執(zhí)行和并行執(zhí)行實(shí)例

    python 串行執(zhí)行和并行執(zhí)行實(shí)例

    這篇文章主要介紹了python 串行執(zhí)行和并行執(zhí)行實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python-Web-flask-視圖內(nèi)容和模板知識(shí)點(diǎn)西寧街

    python-Web-flask-視圖內(nèi)容和模板知識(shí)點(diǎn)西寧街

    在本篇文章里小編給大家分享了關(guān)于python-Web-flask-視圖內(nèi)容和模板的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法

    python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇python 設(shè)置文件編碼格式的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論