Это потому, что дескрипторы должны быть определены только как атрибуты класса, а не атрибуты экземпляра:
Из docs :
Применяются следующие методы когда экземпляр класса, содержащего метод (так называемый класс дескриптора), появляется в классе владельца (дескриптор должен быть либо в словаре класса владельца, либо в словаре классов для одного из его родителей).
Чтобы дескриптор работал с атрибутами экземпляра, вам необходимо переопределить метод
__getattribute__
вBusinessLogic
. (Не проверял это полностью, но отлично работает для вашего случая):def __getattribute__(self, attr): obj = object.__getattribute__(self, attr) if hasattr(obj, '__get__'): return obj.__get__(self, type(self)) return obj
Если у вас есть дескриптор данных, вам также необходимо обработать
__setattr__
.def __setattr__(self, attr, val): try: obj = object.__getattribute__(self, attr) except AttributeError: # This will be raised if we are setting the attribute for the first time # i.e inside `__init__` in your case. object.__setattr__(self, attr, val) else: if hasattr(obj, '__set__'): obj.__set__(self, val) else: object.__setattr__(self, attr, val)