python描述器做权限控制_Python装饰器14-描述器
描述器
這是Python一個(gè)重要的概念,英文名:Descriptor
descriptor是對(duì)象的一個(gè)屬性,只不過(guò)它存在于類的dict中并且有特殊方法get(可能還有set和__delete)而具有一點(diǎn)特別的功能,為了方便指代這樣的屬性,我們給它起了個(gè)名字叫descriptor屬性
雖然如此,還是看起來(lái)很難理解
標(biāo)準(zhǔn)的描述器對(duì)象定義如下:
class Des:
def __init__(self):
self.value = ''
def __get__(self, instance, owner):
print('returned from des obj')
return self.value
def __set__(self, instance, value):
print('set in des obj')
self.value = value
def __delete__(self, instance):
print('delete in des obj')
del self.value
class Foo:
d = Des()
f = Foo()
f.d = 10
print(f.d)
普通對(duì)象、描述器作為類屬性、描述器對(duì)象作為類實(shí)例屬性
class Des:
def __init__(self):
self.value = ''
def __get__(self, instance, owner):
print('returned from des obj')
return self.value
def __set__(self, instance, value):
print('set in des obj')
self.value = value
def __delete__(self, instance):
print('delete in des obj')
del self.value
class Nor:
def __init__(self):
self.value = 10
class Foo:
d = Des()
n = Nor()
def __init__(self):
self.dd = Des()
f = Foo()
f.d = 10
print(f.d)
# 說(shuō)明描述器對(duì)象必須是類的屬性,不能是實(shí)例的屬性
f.dd.value = 20
print(f.dd.value)
# 普通對(duì)象的訪問(wèn)
f.n.value = 30
print(f.n.value)
# 無(wú)法通過(guò).直接訪問(wèn)描述器對(duì)象的屬性
print(f.d.value)
運(yùn)行結(jié)果:
set in des obj
returned from des obj
10
20
30
returned from des obj
Traceback (most recent call last):
File "descriptor2.py", line 39, in
print(f.d.value)
AttributeError: 'int' object has no attribute 'value'
小結(jié)
關(guān)于描述器的講解不止于上述內(nèi)容,可以繼續(xù)參考Python的官方文檔,我們只需要記住以上部分內(nèi)容,便于后續(xù)理解類作為裝飾器。
描述器對(duì)象是類的屬性才可以使用get
描述器對(duì)實(shí)例的賦值和取值都是通過(guò)get和set進(jìn)行,此時(shí)類退化為Data Descriptor,也可以理解為這個(gè)類只是對(duì)一個(gè)數(shù)據(jù)進(jìn)行描述。
總結(jié)
以上是生活随笔為你收集整理的python描述器做权限控制_Python装饰器14-描述器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: node mysql 批量写入_请问如何
- 下一篇: 【廖雪峰Python学习笔记】字符串与编