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

Python中property屬性的用處詳解

 更新時間:2022年04月11日 11:20:09   作者:九柄  
這篇文章主要給大家介紹了關(guān)于Python中property屬性的相關(guān)資料,需簡單地說就是一個類里面的方法一旦被@property裝飾,就可以像調(diào)用屬性一樣地去調(diào)用這個方法,它能夠簡化調(diào)用者獲取數(shù)據(jù)的流程,而且不用擔(dān)心將屬性暴露出來,有人對其進行賦值操作,下面要的朋友可以參考下

前言

Python 動態(tài)屬性的概念可能會被面試問到,在項目當(dāng)中也非常實用,但是在一般的編程教程中不會提到,可以進修一下。

先看一個簡單的例子。創(chuàng)建一個 Student 類,我希望通過實例來獲取每個學(xué)生的一些情況,包括名字,成績等。成績只有等到考試結(jié)束以后才會有,所以實例化的時候不會給它賦值。

class Student:
    def __init__(self, name):
        self.name = name
        self.score = None

mike = Student('mike')

考試完以后,準(zhǔn)備給 mike 打分:

mike.score = 999

在這里,老師一不小心多打了個 9 ,通常來說打分都是 100 分值,999 是一個非法數(shù)據(jù),不應(yīng)該賦值成功。學(xué)生一多,老師打分出現(xiàn)手誤的情況肯定會越來越多,所以我們必須想辦法修改程序,限制 score 的值必須在 0-100 分。

限制值

我們定義一個方法,如果輸入的不是 0-100 的整數(shù),就讓程序報錯,數(shù)據(jù)合法,我們就把 score 屬性修改成功。

def set_score(self, new_score):
    if not isinstance(new_score, int):
        raise ValueError('score must be int')

    if 0 <= new_score <= 100:
        self.score = new_score
        return self.score
    else:
        raise ValueError('score invalid')

這樣我們每次需要獲取成績的時候使用 self.score 獲取,修改成績的時候調(diào)用函數(shù)來修改:

mike.set_score(999)

調(diào)用以后會報錯,因為 999 是非法數(shù)據(jù)。注意,這個時候我使用 self.score 還是可以進行設(shè)置,而且不報錯:

self.score = 999

這顯然是不行的。所以我們要提供一種機制,把 score 變成私有屬性,不能讓外部訪問。很遺憾,python 的私有屬性是偽私有。通常我們把 _ 開頭的屬性叫私有屬性,但是這只是一種協(xié)議和規(guī)定,你看到下劃線開頭的屬性,不要去訪問了。你硬要訪問,是可以的,python 并不會禁止。

使用 @property 的方式代替。

上面的方法雖然實現(xiàn)了功能,但是改變了屬性的使用方式。平常是這樣使用的:

# 獲取屬性
a = mike.score
# 設(shè)置屬性
mike.score = 99

@property
def score(self):
    return self._score

@score.setter
def score(self, new_score):
    if not isinstance(new_score, int):
        raise ValueError('score must be int')

        if 0 <= new_score <= 100:
            self._score = new_score
            return self._score
        else:
            raise ValueError('score invalid')

動態(tài)屬性的好處

  • 統(tǒng)一了調(diào)用方式。self.score = 99 的方式,而不是函數(shù)調(diào)用的方式。
  • _score 我們就不直接去使用了。你要用也可以,不建議。
  • 如果我們一個屬性只可以讀,把 setter 部分注釋掉就可以了。

現(xiàn)在我們來完善這個類,添加 birth 屬性和年齡屬性:

from datetime import datetime

class Student:
    def __init__(self, name, birth=1920):
        self.name = name
        self._score = None
        self.birth = birth
        self.age = datetime.now().year - self.birth

mike = Student('mike')
print(mike.birth)
print(mike.age)
  • birth 和 age 這兩個是可以根據(jù)一個求出另外一個的。存在數(shù)據(jù)冗余問題。

  • age 屬性這樣是有問題的。mike 初始化的時候,age 已經(jīng)被求出來了,如果我在下一年再去訪問 age 屬性,那他就是個錯誤的值??梢酝ㄟ^把 age 設(shè)成現(xiàn)在的秒數(shù)來驗證:

    self.age = datetime.now().second
    
    mike = Student('mike')
    time.sleep(5)
    print(mike.age)
    print(datetime.now().second)

動態(tài)顯示

@property
def age(self):
    return datetime.now().year - self.birth

注意,這里不要去設(shè)置 @age.setter ,因為他是動態(tài)變化的,你修改了會造成數(shù)據(jù)不一致,它只能作為一個只讀屬性。

@property 作用和應(yīng)用場景:

  • @property 優(yōu)化了屬性讀取和設(shè)置的可讀性
  • 需要限制屬性的特征;
  • 只讀屬性。如果屬性只可以讀,不可以寫,用起來很方便。
  • 這個屬性根據(jù)一個變化的環(huán)境動態(tài)改變。

附:用property代替getter和setter方法

>>>class Watermelon():
? ? ? ?def __init__(self,price):
? ? ? ? ? ?self._price = price ? ? ? ? ? ? ? ? ?#私有屬性,外部無法修改和訪問

? ? ? ?def get_price(self):
? ? ? ? ? ?return self._price

? ? ? ?def set_price(self,new_price):
? ? ? ? ? ?if new_price > 0:
? ? ? ? ? ? ? ?self._price = new_price
? ? ? ? ? ?else:
? ? ? ? ? ? ? ?raise 'error:價格必須大于零'

用property代替getter和setter

>>>class Watermelon():
       def __init__(self,price):
           self._price = price

       @property                          #使用@property裝飾price方法
       def price(self):
           return self._price

       @price.setter                      #使用@property裝飾方法,當(dāng)對price賦值時,調(diào)用裝飾方法
       def price(self,new_price):
           if new_price > 0:
               self._price = new_price
           else:
               raise 'error:價格必須大于零'
 
>>> watermelon = Watermelon(4)
>>> 
>>> watermelon.price
4
>>> 
>>> watermelon.price = 7
>>> 
>>> watermelon.price
7

總結(jié)

到此這篇關(guān)于Python中property屬性用處的文章就介紹到這了,更多相關(guān)Python中property屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python使用win32com在百度空間插入html元素示例

    python使用win32com在百度空間插入html元素示例

    這篇文章主要介紹了python使用win32com在百度空間插入html元素的示例,大家參考使用吧
    2014-02-02
  • Python基于scipy實現(xiàn)信號濾波功能

    Python基于scipy實現(xiàn)信號濾波功能

    本文將以實戰(zhàn)的形式基于scipy模塊使用Python實現(xiàn)簡單濾波處理。這篇文章主要介紹了Python基于scipy實現(xiàn)信號濾波功能,需要的朋友可以參考下
    2019-05-05
  • Python中的 is 和 == 以及字符串駐留機制詳解

    Python中的 is 和 == 以及字符串駐留機制詳解

    這篇文章主要介紹了Python中的 is 和 == 以及字符串駐留機制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-06-06
  • Python 生成短8位唯一id實戰(zhàn)教程

    Python 生成短8位唯一id實戰(zhàn)教程

    這篇文章主要介紹了Python 生成短8位唯一id實戰(zhàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 使用Python和XML實現(xiàn)文件復(fù)制工具的完整代碼

    使用Python和XML實現(xiàn)文件復(fù)制工具的完整代碼

    在本篇博客中,我們將學(xué)習(xí)如何使用 wxPython 構(gòu)建一個簡單的文件復(fù)制工具,并將文件路徑和目標(biāo)目錄的配置信息保存到 XML 文件中,通過這種方式,我們可以在下次運行程序時輕松加載之前保存的配置,需要的朋友可以參考下
    2024-08-08
  • 使用opencv相關(guān)函數(shù)確定圖片中的直線問題

    使用opencv相關(guān)函數(shù)確定圖片中的直線問題

    這篇文章主要介紹了使用opencv相關(guān)函數(shù)確定圖片中的直線問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python實現(xiàn)兩個一維列表合并成一個二維列表

    python實現(xiàn)兩個一維列表合并成一個二維列表

    今天小編就為大家分享一篇python實現(xiàn)兩個一維列表合并成一個二維列表,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python字典遍歷數(shù)據(jù)的具體做法

    python字典遍歷數(shù)據(jù)的具體做法

    在本篇文章里小編給大家整理了一篇關(guān)于python字典遍歷數(shù)據(jù)的具體做法及相關(guān)代碼,有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-07-07
  • 基于Python編寫一個單詞自測程序

    基于Python編寫一個單詞自測程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個單詞自測程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Python如何實現(xiàn)MySQL實例初始化詳解

    Python如何實現(xiàn)MySQL實例初始化詳解

    這篇文章主要給大家介紹了關(guān)于Python如何實現(xiàn)MySQL實例初始化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評論

德安县| 霍山县| 宁强县| 兴文县| 云安县| 福建省| 湘乡市| 南皮县| 马关县| 阜新| 舟曲县| 宜川县| 塘沽区| 张家界市| 靖宇县| 腾冲县| 关岭| 湘西| 铜川市| 仙游县| 灵宝市| 柳州市| 景德镇市| 凉山| 靖边县| 景宁| 册亨县| 三台县| 乐都县| 平顶山市| SHOW| 罗甸县| 伊川县| 山西省| 墨江| 渝中区| 莱芜市| 宁武县| 旬邑县| 浮梁县| 江安县|