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

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