python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)
描述符只實用于大型框架
1、描述符是什么?
描述符本質就是一個新式類,在這個新式類中,至少實現了__get__(),__set__(),__delete__()中的一個,這也被稱為描述符協議
__get__():調用一個屬性時,觸發
__set__():為一個屬性賦值時,觸發
__delete__():采用del刪除屬性時,觸發
描述符代碼示例:class?Foo:?#在python3中Foo是新式類,它實現了三種方法,這個類就被稱作一個描述符
def?__get__(self,?instance,?owner):
pass
def?__set__(self,?instance,?value):
pass
def?__delete__(self,?instance):
pass
2、描述符是干什么的?
描述符的作用是用來代理另外一個類的屬性的(必須把描述符定義成這個類的類屬性,不能定義到構造函數中)
2.1 描述符類產生的實例進行屬性操作并不會觸發三個方法的執行代碼實例:class?Foo:
def?__get__(self,?instance,?owner):
print('觸發get')
def?__set__(self,?instance,?value):
print('觸發set')
def?__delete__(self,?instance):
print('觸發delete')
#包含這三個方法的新式類稱為描述符,由這個類產生的實例進行屬性的調用/賦值/刪除,并不會觸發這三個方法
f1=Foo()
f1.name='egon'
f1.name
del?f1.name
2.2 描述符被使用代碼實例:class?Foo:
def?__get__(self,?instance,?owner):
print('觸發get')
def?__set__(self,?instance,?value):
print('觸發set')
#?instance.__dict__['x']?=?value????#?傳入值
def?__delete__(self,?instance):
print('觸發delete')
class?Bar:
x?=?Foo()
def?__init__(self,?n):
self.x?=?n
b1?=?Bar(10)????????????#?觸發set
b1.x????????????????????#?觸發get
print(b1.__dict__)??????#?空值
print(Bar.__dict__)?????#?'x':?<__main__.foo>,
del?b1.x????????????????#?觸發delete
3、描述符細分情況:
一 數據描述符:至少實現了__get__()和__set__()class?Foo:
def?__set__(self,?instance,?value):
print('set')
def?__get__(self,?instance,?owner):
print('get')
二 非數據描述符:沒有實現__set__()class?Foo:
def?__get__(self,?instance,?owner):
print('get')
4、描述符注意事項:
一 描述符本身應該定義成新式類,被代理的類也應該是新式類
二 必須把描述符定義成這個類的類屬性,不能為定義到構造函數中
三 要嚴格遵循該優先級,優先級由高到底分別是:
1.類屬性
2.數據描述符
3.實例屬性
4.非數據描述符
5.找不到的屬性觸發__getattr__()
總結
以上是生活随笔為你收集整理的python __set__ __get___python3面对像进阶——描述符(__get__,__set__,__delete__)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP笔记-所有错误统一输出404页面(
- 下一篇: git 获取最新代码_程序员必知:这是一