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

Python中的@property像訪問(wèn)屬性一樣調(diào)用方法示例

 更新時(shí)間:2026年05月29日 09:43:46   作者:程序員榴蓮  
property是Python中的一個(gè)內(nèi)置函數(shù),用于在類(lèi)中創(chuàng)建和管理屬性的getter和setter方法,這篇文章主要介紹了Python中@property像訪問(wèn)屬性一樣調(diào)用方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
# Python 中的 @property:像訪問(wèn)屬性一樣調(diào)用方法
在寫(xiě)類(lèi)的時(shí)候,我們經(jīng)常會(huì)遇到一個(gè)問(wèn)題:  
對(duì)象的屬性如果可以被隨便修改,就可能出現(xiàn)一些不合理的數(shù)據(jù)。
比如一個(gè)人的年齡:
```python
class Person:
    def __init__(self, age):
        self.age = age

然后創(chuàng)建對(duì)象:

person1 = Person(-18)
print(person1.age)

這時(shí)候程序是可以正常運(yùn)行的,但是很明顯不合理。

因?yàn)槟挲g不可能是負(fù)數(shù)。

再比如學(xué)生成績(jī):

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

創(chuàng)建對(duì)象:

student1 = Student(100)
print(student1.score)

一開(kāi)始這樣寫(xiě)沒(méi)什么問(wèn)題。

但是如果外界可以隨便修改:

student1.score = -100

那就會(huì)出現(xiàn)不合理的數(shù)據(jù)。

所以問(wèn)題來(lái)了:
Python 有沒(méi)有像 Java 一樣,可以把屬性保護(hù)起來(lái),然后只暴露指定的接口讓外界調(diào)用呢?

答案是有的。

在 Python 中,我們可以使用 @property 裝飾器來(lái)控制屬性的訪問(wèn)。

一、為什么需要屬性訪問(wèn)控制

如果一個(gè)屬性可以被外界隨便賦值,那么數(shù)據(jù)就可能變得不安全。

比如:

person1 = Person(-18)

這個(gè)對(duì)象雖然創(chuàng)建成功了,但是 -18 這個(gè)年齡明顯是不合理的。

我們希望在給 age 賦值的時(shí)候,能夠先判斷一下:

if age < 0 or age > 120:
    raise ValueError("不合理的年齡")

如果年齡不合理,就直接拋出異常。

二、使用 @property 定義屬性

完整代碼如下:

class Person:
    def __init__(self, age):
        self.age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        if age < 0 or age > 120:
            raise ValueError('不合理的年齡')
        self._age = age


person1 = Person(18)
print(person1.age)

這段代碼中,最重要的部分就是:

@property
def age(self):
    return self._age

@property 的作用是:

把一個(gè)方法變成屬性一樣來(lái)訪問(wèn)。

也就是說(shuō),雖然 age 本質(zhì)上是一個(gè)方法:

def age(self):
    return self._age

但是我們調(diào)用的時(shí)候不需要寫(xiě)成:

person1.age()

而是可以直接寫(xiě):

person1.age

看起來(lái)就像是在訪問(wèn)普通屬性一樣。

三、使用 setter 控制賦值

下面這段代碼用來(lái)控制給 age 賦值:

@age.setter
def age(self, age):
    if age < 0 or age > 120:
        raise ValueError('不合理的年齡')
    self._age = age

當(dāng)我們執(zhí)行:

self.age = age

或者:

person1.age = 18

實(shí)際上都會(huì)自動(dòng)調(diào)用這個(gè) setter 方法。

所以在賦值之前,程序會(huì)先判斷年齡是否合法:

if age < 0 or age > 120:
    raise ValueError('不合理的年齡')

如果年齡小于 0,或者大于 120,就會(huì)拋出異常。

如果年齡合理,才會(huì)真正賦值:

self._age = age

四、為什么使用 _age

在代碼中,真正保存年齡的屬性是:

self._age

而不是:

self.age

這是因?yàn)?self.age 已經(jīng)被 @property@age.setter 接管了。

如果在 setter 里面繼續(xù)寫(xiě):

self.age = age

就會(huì)再次調(diào)用 setter,導(dǎo)致無(wú)限遞歸。

所以我們用:

self._age = age

來(lái)真正保存數(shù)據(jù)。

這里的 _age 前面有一個(gè)下劃線,表示這是一個(gè)內(nèi)部使用的屬性,不建議外界直接訪問(wèn)。

五、創(chuàng)建對(duì)象時(shí)發(fā)生了什么

當(dāng)我們創(chuàng)建對(duì)象:

person1 = Person(18)

會(huì)先執(zhí)行構(gòu)造方法:

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

這里的:

self.age = age

并不是簡(jiǎn)單地創(chuàng)建一個(gè)普通屬性。

因?yàn)轭?lèi)里面已經(jīng)定義了:

@age.setter
def age(self, age):

所以這句代碼會(huì)自動(dòng)調(diào)用 setter 方法。

也就是說(shuō),創(chuàng)建對(duì)象的時(shí)候,年齡就已經(jīng)被檢查了一遍。

如果寫(xiě)成:

person1 = Person(-18)

就會(huì)拋出異常:

ValueError: 不合理的年齡

這樣就避免了創(chuàng)建出不合理的對(duì)象。

六、讀取屬性時(shí)發(fā)生了什么

當(dāng)我們執(zhí)行:

print(person1.age)

這里的 .age 其實(shí)不是直接訪問(wèn)屬性,而是在調(diào)用這個(gè)方法:

@property
def age(self):
    return self._age

只不過(guò) @property 讓它看起來(lái)像普通屬性一樣。

所以:

person1.age

本質(zhì)上相當(dāng)于調(diào)用了 getter 方法。

七、@property 的好處

使用 @property 有幾個(gè)好處:

  1. 可以像訪問(wèn)普通屬性一樣訪問(wèn)方法
  2. 可以在賦值時(shí)增加數(shù)據(jù)校驗(yàn)
  3. 可以保護(hù)對(duì)象內(nèi)部數(shù)據(jù)
  4. 可以讓代碼更加安全
  5. 對(duì)外使用簡(jiǎn)單,對(duì)內(nèi)邏輯可控

比如外界仍然可以這樣寫(xiě):

person1.age

也可以這樣賦值:

person1.age = 20

但是賦值的時(shí)候,程序會(huì)自動(dòng)幫我們檢查數(shù)據(jù)是否合法。

八、總結(jié)

@property 裝飾器可以把方法偽裝成屬性來(lái)訪問(wèn)。

它通常和 setter 一起使用:

@property
def age(self):
    return self._age

@age.setter
def age(self, age):
    if age < 0 or age > 120:
        raise ValueError('不合理的年齡')
    self._age = age

這樣做的好處是:

既保留了屬性訪問(wèn)的簡(jiǎn)潔寫(xiě)法,又可以在內(nèi)部控制數(shù)據(jù)是否合法。

簡(jiǎn)單來(lái)說(shuō):

@property

負(fù)責(zé)讀取屬性。

@屬性名.setter

負(fù)責(zé)設(shè)置屬性。

在這個(gè)例子中,我們通過(guò) @property@age.setter,讓 age 屬性不能被隨便設(shè)置成不合理的值。

這就是 Python 中屬性訪問(wèn)控制的一種常見(jiàn)寫(xiě)法。

相關(guān)文章

  • python爬取招聘要求等信息實(shí)例

    python爬取招聘要求等信息實(shí)例

    在本篇文章里小編給大家整理了關(guān)于python爬取招聘要求等信息實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • 使用Python進(jìn)行數(shù)據(jù)庫(kù)交互的實(shí)踐指南(從SQL查詢(xún)到ORM操作)

    使用Python進(jìn)行數(shù)據(jù)庫(kù)交互的實(shí)踐指南(從SQL查詢(xún)到ORM操作)

    在現(xiàn)代應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)庫(kù)交互是核心技能之一,無(wú)論是用戶數(shù)據(jù)存儲(chǔ)、內(nèi)容管理還是交易記錄,幾乎每個(gè)應(yīng)用都需要與數(shù)據(jù)庫(kù)打交道,本文將帶你從零開(kāi)始,系統(tǒng)學(xué)習(xí)SQL查詢(xún)、ORM操作,并教你如何識(shí)別潛在錯(cuò)誤和防范SQL注入攻擊,需要的朋友可以參考下
    2025-07-07
  • matplotlib savefig 保存圖片大小的實(shí)例

    matplotlib savefig 保存圖片大小的實(shí)例

    今天小編就為大家分享一篇matplotlib savefig 保存圖片大小的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python enumerate() 函數(shù)如何實(shí)現(xiàn)索引功能

    Python enumerate() 函數(shù)如何實(shí)現(xiàn)索引功能

    這篇文章主要介紹了Python enumerate() 函數(shù)如何實(shí)現(xiàn)索引功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • OpenCV實(shí)現(xiàn)去除背景識(shí)別的方法總結(jié)

    OpenCV實(shí)現(xiàn)去除背景識(shí)別的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了如何利用OpenCV實(shí)現(xiàn)去除背景識(shí)別的功能,文中為大家總結(jié)了一些方法,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • Django 在iframe里跳轉(zhuǎn)頂層url的例子

    Django 在iframe里跳轉(zhuǎn)頂層url的例子

    今天小編就為大家分享一篇Django 在iframe里跳轉(zhuǎn)頂層url的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    我們?cè)谡碣Y料的時(shí)候,有的時(shí)候過(guò)于混亂難以整理,這時(shí)我們不妨可以對(duì)它先進(jìn)行一個(gè)排序,這樣可以方便我們?yōu)g覽,查詢(xún),有利于我們整理資料,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用,需要的朋友可以參考下
    2022-12-12
  • python科學(xué)計(jì)算之numpy——ufunc函數(shù)用法

    python科學(xué)計(jì)算之numpy——ufunc函數(shù)用法

    今天小編就為大家分享一篇python科學(xué)計(jì)算之numpy——ufunc函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Pycharm安裝python庫(kù)的方法

    Pycharm安裝python庫(kù)的方法

    這篇文章主要介紹了Pycharm安裝python庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python實(shí)現(xiàn)圖片指定位置加圖片水?。ǜ絇yinstaller打包exe)

    Python實(shí)現(xiàn)圖片指定位置加圖片水印(附Pyinstaller打包exe)

    這篇文章主要介紹了Python實(shí)現(xiàn)圖片指定位置加圖片水印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

昂仁县| 浮山县| 准格尔旗| 永福县| 九台市| 阿尔山市| 江北区| 措勤县| 华坪县| 太谷县| 霞浦县| 龙泉市| 乌拉特后旗| 吉首市| 惠州市| 喀喇沁旗| 托克托县| 秦皇岛市| 桐城市| 保山市| 双柏县| 云南省| 象州县| 沭阳县| 桑植县| 时尚| 周宁县| 措美县| 铜陵市| 明星| 南乐县| 长春市| 梁平县| 隆林| 绍兴县| 馆陶县| 镇江市| 安丘市| 宝兴县| 萨迦县| 科技|