亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python 使用@property對屬性進行數(shù)據(jù)規(guī)范性校驗的實現(xiàn)

 更新時間:2021年10月20日 10:23:18   作者:a772304419  
本文主要介紹了Python 使用@property對屬性進行數(shù)據(jù)規(guī)范性校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

s = Student()
s.score = 9999

這顯然不合邏輯。為了限制score的范圍,可以通過一個​​set_score()​​方法來設(shè)置成績,再通過一個​​get_score()​​來獲取成績,這樣,在​​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)在,對任意的Student實例進行操作,就不能隨心所欲地設(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ù)雜,沒有直接用屬性這么直接簡單。

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

還記得裝飾器(decorator)可以給函數(shù)動態(tài)加上功能嗎?對于類的方法,裝飾器一樣起作用。Python內(nèi)置的​​@property​​裝飾器就是負(fù)責(zé)把一個方法變成屬性調(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​​的實現(xiàn)比較復(fù)雜,我們先考察如何使用。把一個getter方法變成屬性,只需要加上​​@property​​就可以了,此時,​​@property​​本身又創(chuàng)建了另一個裝飾器​​@score.setter​​,負(fù)責(zé)把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作:

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

注意到這個神奇的​​@property​​,我們在對實例屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現(xiàn)的。

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

class Student(object):

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

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

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

上面的​​birth​​是可讀寫屬性,而​​age​​就是一個只讀屬性,因為​​age​​可以根據(jù)​​birth​​和當(dāng)前時間計算出來。

要特別注意:屬性的方法名不要和實例變量重名。例如,以下的代碼是錯誤的:

class Student(object):

    # 方法名稱和實例變量均為birth:
    @property
    def birth(self):
        return self.birth

這是因為調(diào)用​​s.birth​​時,首先轉(zhuǎn)換為方法調(diào)用,在執(zhí)行​​return self.birth​​時,又視為訪問​​self​​的屬性,于是又轉(zhuǎn)換為方法調(diào)用,造成無限遞歸,最終導(dǎo)致棧溢出報錯​​RecursionError​​。

小結(jié)

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

練習(xí)

請利用​​@property​​給一個​​Screen​​對象加上​​width​​和​​height​​屬性,以及一個只讀屬性​​resolution​​:

# -*- coding: utf-8 -*-
# 測試:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('測試通過!')
else:
print('測試失敗!')

完整源碼:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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

s = Student()
s.score = 60
print('s.score =', s.score)
# ValueError: score must between 0 ~ 100!
s.score = 9999

到此這篇關(guān)于Python 使用@property對屬性進行數(shù)據(jù)規(guī)范性校驗的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python @property 屬性校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python selenium實現(xiàn)斷言3種方法解析

    Python selenium實現(xiàn)斷言3種方法解析

    這篇文章主要介紹了Python selenium實現(xiàn)斷言3種方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Python移位密碼、仿射變換解密實例代碼

    Python移位密碼、仿射變換解密實例代碼

    凱撒密碼(Caesar 密碼)是最早的代換密碼,也是古典對稱密碼體制的典型代表,已經(jīng)初步體現(xiàn)出近代密碼系統(tǒng)的雛形,這篇文章主要給大家介紹了關(guān)于Python移位密碼、仿射變換解密的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • Python語法之精妙的十個知識點(裝B語法)

    Python語法之精妙的十個知識點(裝B語法)

    本文精心篩選了最能展現(xiàn) Python 語法之精妙的十個知識點,并附上詳細的實例代碼,需要的朋友可以參考下
    2020-01-01
  • Python自動化操作Excel方法詳解(xlrd,xlwt)

    Python自動化操作Excel方法詳解(xlrd,xlwt)

    Excel是Windows環(huán)境下流行的、強大的電子表格應(yīng)用。本文將詳解用Python利用xlrd和xlwt實現(xiàn)自動化操作Excel的方法詳細,需要的可以參考一下
    2022-06-06
  • Python實現(xiàn)將多張圖片合成視頻并加入背景音樂

    Python實現(xiàn)將多張圖片合成視頻并加入背景音樂

    這篇文章主要為大家介紹了如何利用Python實現(xiàn)將多張圖片合成mp4視頻,并加入背景音樂。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-04-04
  • OpenCV實現(xiàn)圖像濾波之雙邊濾波

    OpenCV實現(xiàn)圖像濾波之雙邊濾波

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像濾波之雙邊濾波,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python實現(xiàn)的搖骰子猜大小功能小游戲示例

    Python實現(xiàn)的搖骰子猜大小功能小游戲示例

    這篇文章主要介紹了Python實現(xiàn)的搖骰子猜大小功能小游戲,涉及Python隨機數(shù)運算與數(shù)值判斷相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Python3獲取cookie常用三種方案

    Python3獲取cookie常用三種方案

    這篇文章主要介紹了Python3獲取cookie常用三種方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • python文件特定行插入和替換實例詳解

    python文件特定行插入和替換實例詳解

    這篇文章主要介紹了python文件特定行插入和替換實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • PyCharm如何配置SSH和SFTP連接遠程服務(wù)器

    PyCharm如何配置SSH和SFTP連接遠程服務(wù)器

    這篇文章主要介紹了PyCharm如何配置SSH和SFTP連接遠程服務(wù)器,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論