Say, we put two different descriptors in a class, and then check how they work being requested from an instance and a class itself.
class DescrGet:
def __get__(self, instance, typ):
print("DescrGet")
class DescrSet:
def __set__(self, instance, value):
print("DescrSet")
class A:
descr_get = DescrGet()
descr_set = DescrSet()
>>> a = A()
>>> a.descr_get
DescrGet
>>> a.descr_set = 42
DescrSet
>>> A.descr_get
DescrGet
>>> A.descr_set = 42
>>> print(A.descr_set)
42
Seems like quite inconsistent behaviour.
From python docs page about descriptors, I get the basic concepts of how python looks up for requested attribute. But it says nothing about setting an atribute.
Here, after searching in type(A).__dict__ (finds nothing of course) python continues to search in A.__dict__ for descriptor and when successfully finds it, calls __get__ method but (surprisingly) doesn't call __set__ and simply sets A.a to 42.
Could someone provide explanation for such behaviour or give any links?