这是因为描述符仅应定义为类属性,而不是实例属性:
从文档:
以下方法仅在包含该方法的类的实例(所谓的描述符类)出现在所有者类中( 描述符必须位于所有者的类字典或父类的父类的类字典中 )时适用。
为了使描述符也能与实例属性一起使用,您需要重写。
__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)



