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

介紹Python的@property裝飾器的用法

 更新時(shí)間:2015年04月28日 09:40:09   作者:廖雪峰  
這篇文章主要介紹了介紹Python的@property裝飾器的用法,是Python學(xué)習(xí)進(jìn)階中的重要知識(shí),代碼基于Python2.x版本,需要的朋友可以參考下

在綁定屬性時(shí),如果我們直接把屬性暴露出去,雖然寫起來(lái)很簡(jiǎn)單,但是,沒辦法檢查參數(shù),導(dǎo)致可以把成績(jī)隨便改:

s = Student()
s.score = 9999

這顯然不合邏輯。為了限制score的范圍,可以通過一個(gè)set_score()方法來(lái)設(shè)置成績(jī),再通過一個(gè)get_score()來(lái)獲取成績(jī),這樣,在set_score()方法里,就可以檢查參數(shù):

class Student(object):

  def get_score(self):
    return self._score

  def set_score(self, value):
    if not isinstance(value, int):
      raise ValueError('score must be an integer!')
    if value < 0 or value > 100:
      raise ValueError('score must between 0 ~ 100!')
    self._score = value

現(xiàn)在,對(duì)任意的Student實(shí)例進(jìn)行操作,就不能隨心所欲地設(shè)置score了:

>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
 ...
ValueError: score must between 0 ~ 100!

但是,上面的調(diào)用方法又略顯復(fù)雜,沒有直接用屬性這么直接簡(jiǎn)單。

有沒有既能檢查參數(shù),又可以用類似屬性這樣簡(jiǎn)單的方式來(lái)訪問類的變量呢?對(duì)于追求完美的Python程序員來(lái)說(shuō),這是必須要做到的!

還記得裝飾器(decorator)可以給函數(shù)動(dòng)態(tài)加上功能嗎?對(duì)于類的方法,裝飾器一樣起作用。Python內(nèi)置的@property裝飾器就是負(fù)責(zé)把一個(gè)方法變成屬性調(diào)用的:

class Student(object):

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

  @score.setter
  def score(self, value):
    if not isinstance(value, int):
      raise ValueError('score must be an integer!')
    if value < 0 or value > 100:
      raise ValueError('score must between 0 ~ 100!')
    self._score = value

@property的實(shí)現(xiàn)比較復(fù)雜,我們先考察如何使用。把一個(gè)getter方法變成屬性,只需要加上@property就可以了,此時(shí),@property本身又創(chuàng)建了另一個(gè)裝飾器@score.setter,負(fù)責(zé)把一個(gè)setter方法變成屬性賦值,于是,我們就擁有一個(gè)可控的屬性操作:

>>> s = Student()
>>> s.score = 60 # OK,實(shí)際轉(zhuǎn)化為s.set_score(60)
>>> s.score # OK,實(shí)際轉(zhuǎn)化為s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
 ...
ValueError: score must between 0 ~ 100!

注意到這個(gè)神奇的@property,我們?cè)趯?duì)實(shí)例屬性操作的時(shí)候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來(lái)實(shí)現(xiàn)的。

還可以定義只讀屬性,只定義getter方法,不定義setter方法就是一個(gè)只讀屬性:

class Student(object):

  @property
  def birth(self):
    return self._birth

  @birth.setter
  def birth(self, value):
    self._birth = value

  @property
  def age(self):
    return 2014 - self._birth

上面的birth是可讀寫屬性,而age就是一個(gè)只讀屬性,因?yàn)閍ge可以根據(jù)birth和當(dāng)前時(shí)間計(jì)算出來(lái)。
小結(jié)

@property廣泛應(yīng)用在類的定義中,可以讓調(diào)用者寫出簡(jiǎn)短的代碼,同時(shí)保證對(duì)參數(shù)進(jìn)行必要的檢查,這樣,程序運(yùn)行時(shí)就減少了出錯(cuò)的可能性。

相關(guān)文章

  • python教程十行代碼教你語(yǔ)音轉(zhuǎn)文字QQ微信聊天

    python教程十行代碼教你語(yǔ)音轉(zhuǎn)文字QQ微信聊天

    QQ上面發(fā)的語(yǔ)音消息是可以直接文字識(shí)別的,但是微信為什么沒有呢?是因?yàn)榧夹g(shù)太難實(shí)現(xiàn)嗎?這個(gè)很簡(jiǎn)單?。〗裉旖o大家介紹一下語(yǔ)音轉(zhuǎn)文字的原理
    2021-09-09
  • Python pygame 動(dòng)畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理

    Python pygame 動(dòng)畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了Python pygame 動(dòng)畫游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • python實(shí)現(xiàn)線程池的方法

    python實(shí)現(xiàn)線程池的方法

    這篇文章主要介紹了python實(shí)現(xiàn)線程池的方法,實(shí)例分析了Python線程池的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • Python中的偏函數(shù)及其廣泛應(yīng)用方式

    Python中的偏函數(shù)及其廣泛應(yīng)用方式

    這篇文章主要介紹了Python中的偏函數(shù)及其廣泛應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 一文帶你深入了解Python中的數(shù)據(jù)清洗

    一文帶你深入了解Python中的數(shù)據(jù)清洗

    數(shù)據(jù)清洗一般包括:空值,異常值,重復(fù)值,類型轉(zhuǎn)換和數(shù)據(jù)整合這些操作,這篇文章將通過一些示例為大家詳細(xì)講講Python中數(shù)據(jù)清洗的操作的實(shí)現(xiàn),需要的可以參考一下
    2023-03-03
  • Python sqrt()函數(shù)用法說(shuō)明

    Python sqrt()函數(shù)用法說(shuō)明

    這篇文章主要介紹了Python sqrt()函數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-03-03
  • Python寫捕魚達(dá)人的游戲?qū)崿F(xiàn)

    Python寫捕魚達(dá)人的游戲?qū)崿F(xiàn)

    這篇文章主要介紹了Python寫捕魚達(dá)人的游戲?qū)崿F(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python使用正則表達(dá)式過濾或替換HTML標(biāo)簽的方法詳解

    Python使用正則表達(dá)式過濾或替換HTML標(biāo)簽的方法詳解

    這篇文章主要介紹了Python使用正則表達(dá)式過濾或替換HTML標(biāo)簽的方法,簡(jiǎn)單介紹了Python正則相關(guān)語(yǔ)法并結(jié)合具體實(shí)例形式分析了Python基于正則表達(dá)式的HTML標(biāo)簽過濾與替換相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • python 設(shè)置輸出圖像的像素大小方法

    python 設(shè)置輸出圖像的像素大小方法

    今天小編就為大家分享一篇python 設(shè)置輸出圖像的像素大小方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-07-07
  • matplotlib.pyplot畫圖 圖片的二進(jìn)制流的獲取方法

    matplotlib.pyplot畫圖 圖片的二進(jìn)制流的獲取方法

    今天小編就為大家分享一篇matplotlib.pyplot畫圖 圖片的二進(jìn)制流的獲取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-05-05

最新評(píng)論

万源市| 达日县| 渝中区| 筠连县| 岳西县| 中方县| 贡觉县| 邯郸县| 嘉义市| 晋州市| 龙井市| 泰兴市| 获嘉县| 南平市| 漳平市| 鹿泉市| 德庆县| 咸宁市| 松溪县| 保亭| 迁西县| 甘孜县| 大庆市| 志丹县| 雅安市| 怀仁县| 宣汉县| 容城县| 襄城县| 盈江县| 峨眉山市| 淮滨县| 桐乡市| 亚东县| 临颍县| 镇坪县| 东明县| 射洪县| 乐清市| 封丘县| 潼关县|