描述器
定義了__get__
和__set__
方法的描述器稱為數(shù)據(jù)描述器
只定義了__get__
的描述器稱為非數(shù)據(jù)描述器
二者區(qū)別:當(dāng)屬性名和描述器名相同時,在訪問這個同名屬性時,如果是數(shù)據(jù)描述器就會先訪問描述器狡相,如果是非數(shù)據(jù)描述器就會先訪問屬性铸抑。
如下:
class A:
def __init__(self, a=1):
self.a = a
def __get__(self, instance, owner):
print('get from A')
return self.a
def __set__(self, instance, value):
print('set from A')
self.a = value
def __delete__(self, instance):
print('del from A')
class B:
"""
非資料描述器
"""
def __init__(self, b=2):
self.b = b
def __get__(self, instance, owner):
print('get from B')
return self.b
class Test:
a = A()
b = B()
def __init__(self, a, b):
self.a = a
self.b = b
print(Test.a) # 1
print(Test.b) # 2
t = Test(0, 9)
print(t.a) # 0
print(t.b) # 9
print(Test.a) # 0
print(Test.b) # 2
print(t.__dict__) # {'b': 9}
del Test.a
print(Test.a) # AttributeError: type object 'Test' has no attribute 'a'