python描述器做权限控制_Python装饰器14-描述器
描述器
這是Python一個重要的概念,英文名:Descriptor
descriptor是對象的一個屬性,只不過它存在于類的dict中并且有特殊方法get(可能還有set和__delete)而具有一點特別的功能,為了方便指代這樣的屬性,我們給它起了個名字叫descriptor屬性
雖然如此,還是看起來很難理解
標準的描述器對象定義如下:
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)
普通對象、描述器作為類屬性、描述器對象作為類實例屬性
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)
# 說明描述器對象必須是類的屬性,不能是實例的屬性
f.dd.value = 20
print(f.dd.value)
# 普通對象的訪問
f.n.value = 30
print(f.n.value)
# 無法通過.直接訪問描述器對象的屬性
print(f.d.value)
運行結果:
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'
小結
關于描述器的講解不止于上述內容,可以繼續參考Python的官方文檔,我們只需要記住以上部分內容,便于后續理解類作為裝飾器。
描述器對象是類的屬性才可以使用get
描述器對實例的賦值和取值都是通過get和set進行,此時類退化為Data Descriptor,也可以理解為這個類只是對一個數據進行描述。
總結
以上是生活随笔為你收集整理的python描述器做权限控制_Python装饰器14-描述器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node mysql 批量写入_请问如何
- 下一篇: 宝塔面板 mysql装不上_宝塔面板强制