網(wǎng)站首頁 編程語言 正文
本文主要內(nèi)容:
- 解釋setter和getter的使用方法解釋@property裝飾器的妙用
- 在python中,setter和getter方法并不像其它編程語言中的那樣。基本上,在面向?qū)ο缶幊陶Z言中,使用setter和getter方法的主要目的是為了確保數(shù)據(jù)的封裝。不像其它面向?qū)ο缶幊陶Z言,python中的私有變量并不是真正的隱藏字段。在python中,通常在以下情況會(huì)用到setter和getter方法:
- 在獲取或者設(shè)置屬性值的時(shí)候使用setter和getter方法為其添加驗(yàn)證邏輯避免對(duì)類的某些字段直接訪問,比如類的私有變量不應(yīng)該被外部調(diào)用者直擊訪問或者修改
使用普通函數(shù)實(shí)現(xiàn)setter和getter方法
要實(shí)現(xiàn)setter和getter屬性,只是定義普通方法get()和set()并不能反產(chǎn)生任何特殊的行為,例如:
class Student(object):
def __int(self, age=0):
self._age = age
# getter方法
def get(self):
return self._age
# setter方法
def set(self, value):
self._age = value
xiaoming = Student()
# 使用setter方法設(shè)置age
xiaoming.set(20)
# 使用getter方法返回age
print(xiaoming.get())
print(xiaoming._age)
輸出:
20
20
在上面代碼中,set_age()和get_age()方法與普通方法并沒有什么兩樣,那么如何實(shí)現(xiàn)像getter和setter一樣的功能呢?這就要用到python中的特殊方法property()。
使用property()方法來實(shí)現(xiàn)setter和getter的行為
property()是python中的一個(gè)內(nèi)置方法,它創(chuàng)建并返回一個(gè)屬性對(duì)象。一個(gè)屬性對(duì)象有三個(gè)方法,getter()、setter()和delete()。property()內(nèi)置方法有四個(gè)參數(shù),property(fget,fset, fdel, doc)。fget是一個(gè)用于獲取屬性值的函數(shù),fset是一個(gè)用于設(shè)置屬性值的函數(shù),fdel是一個(gè)用于刪除屬性的函數(shù),doc用于為屬性創(chuàng)建文檔說明。一個(gè)屬性兌現(xiàn)有三個(gè)方法,getter()、setter()和delete()分別制定fget、fset、fdel。
class Adult(object):
def __int(self):
self.__age = 0
# 獲取屬性_age的值
def get_age(self):
print('getter() method called')
return self.__age
# 設(shè)置屬性_age的值
def set_age(self, value):
print('setter() method called')
self.__age = value
# 刪除屬性_age
def del_age(self):
del self.__age
age = property(get_age, set_age, del_age)
laowang = Adult()
laowang.age = 60
print(laowang.age)
輸出:
setter() method called
getter() method called
60
在上面的代碼中,age就是一個(gè)屬性對(duì)象,它保證了對(duì)私有變量的安全訪問。
使用@property裝飾器來實(shí)現(xiàn)setter和getter的行為
除了上面使用property()的方法來實(shí)現(xiàn)getter、setter方法的行為,在python中還可以裝飾器@property來實(shí)現(xiàn)。@property是python的一個(gè)內(nèi)置裝飾器,使用裝飾器的目的是改變類的方法或者屬性,這樣調(diào)用者就無需在代碼中做任何改動(dòng)。
class Adult(object):
def __init__(self):
self.__age = 0
@property
def age(self):
print('getter() method called')
return self.__age
@age.setter
def age(self, value):
if value < 18:
raise ValueError('Sorry, you are a child, games not allowed')
print('setter() method called')
self.__age = value
xiaoli = Adult()
xiaoli.age = 19
print(xiaoli.age)
輸出:
setter() method called
getter() method called
19
上面的代碼清晰地展示了如何用pythonic的方式使用@property裝飾器實(shí)現(xiàn)setter和getter屬性。同時(shí)實(shí)現(xiàn)了對(duì)屬性賦值時(shí)的有效性檢查。
原文鏈接:https://blog.csdn.net/weixin_73136678/article/details/128190690
相關(guān)推薦
- 2023-02-06 shell腳本實(shí)戰(zhàn)之部署nginx腳本實(shí)例_nginx
- 2022-07-31 C語言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例_C 語言
- 2023-01-21 python中封裝token問題_python
- 2022-09-26 數(shù)據(jù)結(jié)構(gòu)---圖、十字鏈表及其代碼實(shí)現(xiàn)
- 2022-11-26 React?DnD如何處理拖拽詳解_React
- 2022-01-18 Django解決前端/客戶端POST失敗提示csrf_tokenxxx的問題
- 2022-05-04 EF使用數(shù)據(jù)注解特性創(chuàng)建表結(jié)構(gòu)_實(shí)用技巧
- 2022-09-25 MyBatis實(shí)現(xiàn)多表查詢(一對(duì)一、一對(duì)多)的方式
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支