描述符:
如果一個(gè)類中包含了三個(gè)魔術(shù)方法( get , set , delete )之一或者全部的類這個(gè)類就是一個(gè)描述符
描述符的作用:
描述符的作用就是對類/對象中某個(gè)成員進(jìn)行詳細(xì)的管理操作。
數(shù)據(jù)描述符:(完整)
同時(shí)具備三個(gè)魔術(shù)方法的類就是數(shù)據(jù)描述符
非數(shù)據(jù)描述符(不完整):
沒有同時(shí)具備三個(gè)魔術(shù)方法的類就是非數(shù)據(jù)描述符
三個(gè)魔術(shù)方法:
__get__():
觸發(fā)時(shí)機(jī):在訪問對象成員屬性(該成員已經(jīng)交給描述符管理的時(shí)候)的時(shí)候觸發(fā)
作用:設(shè)置當(dāng)前屬性獲取的值
參數(shù):self 描述符的對象 / 第二個(gè) 被管理成員的類的對象 / 第三個(gè) 被管理成員的類
返回值:可有可無,有的話就是獲取的值
注意事項(xiàng):無
__set__():
觸發(fā)時(shí)機(jī):在設(shè)置對象成員屬性(該成員已經(jīng)交給描述符管理的時(shí)候)的時(shí)候觸發(fā)
作用:對成員的值進(jìn)行設(shè)置管理
參數(shù):self 描述符的對象 / 第二個(gè) 被管理成員的類的對象 / 第三個(gè) 要設(shè)置的值
返回值:無
注意事項(xiàng):設(shè)置值的時(shí)候一定要設(shè)置當(dāng)前描述符對象的臨時(shí)變量
__delete__():
觸發(fā)時(shí)機(jī):在刪除對象成員屬性(該成員已經(jīng)交給描述符管理的時(shí)候)的時(shí)候觸發(fā)
作用:對成員的值進(jìn)行刪除管理
參數(shù):self 描述符的對象 / 第二個(gè) 被管理成員的類的對象
返回值:無
注意事項(xiàng):刪除值的時(shí)候一定要?jiǎng)h除當(dāng)前描述符對象的臨時(shí)變量
例:
class Descriptor:
#初始化一個(gè)臨時(shí)的成員屬性(代替原有username的操作)
def __init__(self):
self.tmpvar = '匿名用戶'#屬性隨便給,這個(gè)就是控制的入口
#定義描述符的三個(gè)成員
def __get__(self,obj,cls):#self 描述符的對象 obj Email對象mail cls Email類
#希望獲取用戶名的時(shí)候僅僅返回第一個(gè)和最后一個(gè)字符 其余的都隱藏
result = self.tmpvar[0] + '*' + self.tmpvar[-1]
return result
def __set__(self,obj,val):#self 描述符的對象 / obj Email對象mail /val 要設(shè)置的值
#設(shè)置值的時(shí)候一定要設(shè)置當(dāng)前描述符對象的臨時(shí)變量
#限制用戶名不能超過8個(gè)字符
#檢測字符個(gè)數(shù)
if len(val) > 8:
self.tmpvar = val[0:8]
else:
self.tmpvar = val
def __delete__(self,obj):#self 描述符的對象/ obj Email對象mail
#刪除臨時(shí)變量即可
if obj.isallowdel_username == True:
del self.tmpvar
#聲明一個(gè)類(郵箱)
class Email:
#成員屬性
username = Descriptor()#用戶名 交給描述符管理 [交接行為]
#設(shè)置一個(gè)是否允許刪除username的標(biāo)志
isallowdel_username = True
# 實(shí)例化對象
mail = Email()
# 訪問用戶名
#print(mail.username)
# 設(shè)置用戶名
mail.username = 'lovemybaby'
# print(mail.username)
# 刪除用戶名的操作
print(mail.username)
del mail.username
# print(mail.username)
描述符和屬性魔術(shù)方法:
屬性魔術(shù)方法
_ _getattribute_ _
_ _getattr_ _
_ _setattr_ _
_ _delattr_ _
【針對當(dāng)前類/對象所有成員的管理,屬性魔術(shù)方法僅對當(dāng)前類有效】
描述符(是一個(gè)類):
_ _get_ _
_ _set_ _
_ _delete_ _
【僅僅針對類/對象某一個(gè)成員的設(shè)置,描述符可對不同的類使用】
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
