Наследование аннотаций класса

Это потому, что дескрипторы должны быть определены только как атрибуты класса, а не атрибуты экземпляра:

Из 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)

16
задан Luke 24 August 2011 в 09:59
поделиться