Дескрипторы Python устанавливают и получают поведение

Скажем, мы помещаем в класс два разных дескриптора, а затем проверяем, как они работают при запросе из экземпляра и самого класса.

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

Похоже на довольно непоследовательное поведение. На странице документации по python, посвященной дескрипторам, я получил основные понятия о том, как выглядит python. для запрошенного атрибута. Но это ничего не говорит об установке атрибута. Здесь, после поиска в type(A).__dict__ (конечно, ничего не находит), python продолжает искать дескриптор в A.__dict__ и, когда успешно находит его, вызывает метод __get__, но (на удивление) не вызывает __set__ и просто устанавливает A.a в 42.

Может ли кто-нибудь объяснить такое поведение или дать какие-либо ссылки?


person A.King    schedule 23.10.2019    source источник