描述器
定义了__get__
和__set__
方法的描述器称为数据描述器
只定义了__get__
的描述器称为非数据描述器
二者区别:当属性名和描述器名相同时,在访问这个同名属性时,如果是数据描述器就会先访问描述器,如果是非数据描述器就会先访问属性。
如下:
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'
网友评论