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

python使用property完成數(shù)據(jù)隱藏封裝與校驗(yàn)

 更新時(shí)間:2024年11月22日 09:16:54   作者:仙草哥哥  
這篇文章主要為大家詳細(xì)介紹了python使用property完成數(shù)據(jù)隱藏封裝與校驗(yàn),實(shí)現(xiàn)安全修改,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助

禁止隨意設(shè)置屬性

需求

考慮這樣一種情況,在某一個(gè)類(lèi)中,有一個(gè)屬性我們不希望別人隨便設(shè)置,因?yàn)檫@可能會(huì)造成很大的麻煩:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculate_area(self):
        return self.width * self.height
 
 
r = Rectangle(3, 4)
print(r.calculate_area())

在這種情況下,長(zhǎng)度和寬度都應(yīng)該是數(shù)字類(lèi)型的,而如果有人在這個(gè)過(guò)程中修改了這個(gè)屬性,那么就會(huì)導(dǎo)致錯(cuò)誤。

r = Rectangle(3, 4)
r.width = "3"
print(r.calculate_area())  # 結(jié)果為3333,明顯不是我們希望的結(jié)果

私有屬性

為了避免他人隨意訪問(wèn),我們可以將其設(shè)置為私有屬性,通??梢蕴砑?個(gè)或者2個(gè)下劃線。

class Rectangle:
    def __init__(self, width, height):
        # 一個(gè)下劃線通常表明了,這個(gè)屬性不應(yīng)該隨意使用,但是不起實(shí)際作用
        self._width = width
        
        # 兩個(gè)下劃線表明了,這個(gè)屬性會(huì)觸發(fā)名稱(chēng)重整,但是也并非真正的私有
        self.__height = height
        
        
r = Rectangle(3, 4)
print(r._width)
 
# 雙下劃線最終會(huì)重整為_(kāi)類(lèi)名__屬性名的形式
print(r._Rectangle__height)

需要注意的是,由于python中沒(méi)有真正的私有屬性,所以,這兩種設(shè)置方法都不能完全起到作用,但是一般而言,兩個(gè)下劃線是更好的,因?yàn)榭梢杂|發(fā)名稱(chēng)重整。

提供訪問(wèn)方法

在這種情況下,為了避免他人隨意設(shè)置屬性,因此需要提供專(zhuān)門(mén)的訪問(wèn)方法。

class Rectangle:
    def __init__(self, width, height):
        self.set_width(width)
        self.set_height(height)
 
    def set_width(self, width):
        if not isinstance(width, (int, float)):
            raise ValueError("width must be a number.")
        if width <= 0:
            raise ValueError("width must be greater than 0.")
        self.__width = width
 
    def set_height(self, height):
        if not isinstance(height, (int, float)):
            raise ValueError("height must be a number.")
        if height <= 0:
            raise ValueError("height must be greater than 0.")
        self.__height = height
 
    def get_width(self):
        return self.__width
 
    def get_height(self):
        return self.__height
 
r = Rectangle(3, 4)
 
# 此時(shí)需要通過(guò)專(zhuān)門(mén)的方法進(jìn)行訪問(wèn)
print(r.get_width())
 
# 非法的設(shè)置不再被允許
r.set_width("3")

但是這樣的使用方法并不方便,因此,在python中,一個(gè)更好的使用方法是通過(guò)property。

property的詳細(xì)介紹

基本語(yǔ)法

基本語(yǔ)法實(shí)現(xiàn)是通過(guò)property的內(nèi)置函數(shù)完成的

class MyClass:
    def __init__(self, value):
        self.value = value
 
    # get方法
    def get_value(self):
        return self.__value
 
    # set方法
    def set_value(self, value):
        if value < 0:
            raise ValueError("value must be non-negative.")
        self.__value = value
 
    # del方法
    def del_value(self):
        print("value is being deleted.")
        del self.__value
 
    # property創(chuàng)建
    value = property(get_value, set_value, del_value)
 
mc = MyClass(20241120)
print(mc.value)

使用裝飾器

class MyClass:
    def __init__(self, value):
        self.value = value
 
    @property
    def value(self):
        return self.__value
 
    @value.setter
    def value(self, value):
        if value < 0:
            raise ValueError("value must be non-negative.")
        self.__value = value
 
    @value.deleter
    def value(self):
        print("value is being deleted.")
        del self.__value

與基本語(yǔ)法的版本效果是相同的

常見(jiàn)應(yīng)用

數(shù)據(jù)隱藏與封裝

property裝飾器允許像訪問(wèn)和操作普通一樣屬性進(jìn)行操作

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
 
    @property
    def width(self):
        return self.__width
 
    @width.setter
    def width(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("width must be a number.")
        if value <= 0:
            raise ValueError("width must be greater than 0.")
        self.__width = value
 
    @property
    def height(self):
        return self.__height
 
    @height.setter
    def height(self, value):
        if not isinstance(value, (int, float)):
            raise ValueError("height must be a number.")
        if value <= 0:
            raise ValueError("height must be greater than 0.")
        self.__height = value
 
        
r = Rectangle(3, 4)
print(r.width)
 
r.width = "3"

設(shè)置只讀屬性

通過(guò)property,可以設(shè)置一個(gè)屬性只允許讀取,不允許修改

class Person:
    def __init__(self, name):
        self.__name = name
 
    @property
    def name(self):
        return self.__name
    
# 初始化的時(shí)候可以設(shè)置名字
p = Person("sagegrass")
 
# 名字可以正常被訪問(wèn)
print(p.name)
 
# 名字不可以被修改,AttributeError: can't set attribute 'name'
p.name = "xxx"

一般來(lái)說(shuō),這樣設(shè)置已經(jīng)足夠保證屬性只讀,但是極特殊的情況下,仍然可以通過(guò)p._Person__name進(jìn)行修改,

不過(guò)通常無(wú)需額外關(guān)注這一問(wèn)題。

動(dòng)態(tài)計(jì)算

關(guān)于一開(kāi)始的例子,我們使用calculate_area進(jìn)行面積的計(jì)算,但是,通過(guò)property就可以將area設(shè)置為一個(gè)屬性,進(jìn)行動(dòng)態(tài)的計(jì)算

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculate_area(self):
        return self.width * self.height

使用property屬性,修改為:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
 
    @property
    def area(self):
        return self.width * self.height
    
r = Rectangle(3, 4)
print(r.area)
r.width = 5
print(r.area)

以上就是python使用property完成數(shù)據(jù)隱藏封裝與校驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于python property數(shù)據(jù)隱藏封裝與校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python填充彩色圖形的實(shí)現(xiàn)示例

    python填充彩色圖形的實(shí)現(xiàn)示例

    本文主要介紹了python填充彩色圖形的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • pytorch 刪除空權(quán)重模型文件夾的方法

    pytorch 刪除空權(quán)重模型文件夾的方法

    如果文件夾exp開(kāi)頭的文件夾,里面沒(méi)有pt pth模型文件,就把目錄刪掉,本文通過(guò)示例代碼介紹pytorch 刪除空權(quán)重模型文件夾的方法,感興趣的朋友一起看看吧
    2023-11-11
  • dataframe 按條件替換某一列中的值方法

    dataframe 按條件替換某一列中的值方法

    今天小編就為大家分享一篇dataframe 按條件替換某一列中的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 關(guān)于Python中的main方法教程

    關(guān)于Python中的main方法教程

    估計(jì)很多人跟我一樣初學(xué)python看代碼的時(shí)候先找一下main()方法,從main往下看。但事實(shí)上python中是沒(méi)有你理解中的“main()”方法的,一起來(lái)看看吧
    2023-03-03
  • Python如何爬取qq音樂(lè)歌詞到本地

    Python如何爬取qq音樂(lè)歌詞到本地

    這篇文章主要介紹了Python如何爬取qq音樂(lè)歌詞到本地,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python刪掉重復(fù)行之drop_duplicates()用法示例

    python刪掉重復(fù)行之drop_duplicates()用法示例

    Pandas的drop_duplicates()方法用于從DataFrame中刪除重復(fù)的行,這篇文章主要給大家介紹了關(guān)于python刪掉重復(fù)行之drop_duplicates()用法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 翻轉(zhuǎn)數(shù)列python實(shí)現(xiàn),求前n項(xiàng)和,并能輸出整個(gè)數(shù)列的案例

    翻轉(zhuǎn)數(shù)列python實(shí)現(xiàn),求前n項(xiàng)和,并能輸出整個(gè)數(shù)列的案例

    這篇文章主要介紹了翻轉(zhuǎn)數(shù)列python實(shí)現(xiàn),求前n項(xiàng)和,并能輸出整個(gè)數(shù)列的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python?使用和高性能技巧操作大全

    Python?使用和高性能技巧操作大全

    這篇文章主要介紹了Python?使用和高性能技巧總結(jié),對(duì)一些python易混淆的操作進(jìn)行對(duì)比,不少 Python 的用戶(hù)是從以前 C/C++ 遷移過(guò)來(lái)的,這兩種語(yǔ)言在語(yǔ)法、代碼風(fēng)格等方面有些不同,本節(jié)簡(jiǎn)要進(jìn)行介紹,需要的朋友可以參考下
    2022-01-01
  • Python使用openpyxl實(shí)現(xiàn)Excel超鏈接批量化設(shè)置

    Python使用openpyxl實(shí)現(xiàn)Excel超鏈接批量化設(shè)置

    在Excel中,超鏈接是一種非常有用的功能,本文我們將介紹如何使用Python來(lái)處理Excel中的超鏈接,以及如何將超鏈接與對(duì)應(yīng)的工作表鏈接起來(lái),需要的可以參考一下
    2023-07-07
  • 如何利用Python解析超大的json數(shù)據(jù)(GB級(jí)別)

    如何利用Python解析超大的json數(shù)據(jù)(GB級(jí)別)

    果不想從頭開(kāi)始創(chuàng)建數(shù)據(jù)格式來(lái)存儲(chǔ)數(shù)據(jù),JSON是一個(gè)不錯(cuò)的選擇,下面這篇文章主要給大家介紹了關(guān)于如何利用Python解析超大的json數(shù)據(jù)(GB級(jí)別)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

当涂县| 宁海县| 灵丘县| 米泉市| 颍上县| 嘉鱼县| 峨山| 唐海县| 台东市| 弥渡县| 泽库县| 中西区| 和龙市| 光泽县| 墨江| 馆陶县| 方山县| 家居| 汾阳市| 阜新市| 乌审旗| 寻甸| 曲周县| 奇台县| 巴塘县| 湘潭县| 澄城县| 贵港市| 永宁县| 景谷| 隆德县| 茂名市| 炉霍县| 淮北市| 南通市| 永宁县| 电白县| 丰镇市| 都江堰市| 荆州市| 固阳县|