为什么在定义为实例属性时不会调用描述符?

时间:2014-04-26 10:39:37

标签: python descriptor

当我制作"数据"变量一个类变量,以下工作,但当我使它成为一个对象变量时,不会调用该描述符。请帮忙。

class Data(object):
    products = {
        'milk': {'price': 1.50, 'quantity': 10},
        'eggs': {'price': 0.20, 'quantity': 100},
        'cheese': {'price': 2.00, 'quantity': 10}
    }
    def __get__(self, obj, klas):
        print "Here in descriptor"
        return self.products

class BusinessLogic(object):
    def __init__(self):         # When I remove these 2 lines 
        self.data = Data()
    #data = Data()             # and enable this line it does work !

def main():
    b = BusinessLogic()
    b.data

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:14)

那是因为描述符只应该被定义为类属性,而不是实例属性:

来自docs

  

以下方法仅适用于类的实例   包含该方法(所谓的描述符类)出现在   所有者类(描述符必须在所有者的类中   字典或其父母之一的类字典)。

要使描述符与实例属性一起使用,您还需要覆盖__getattribute__的{​​{1}}方法。(没有对此进行彻底测试,但适用于您的情况):

BusinessLogic

如果您有数据描述符,那么您还需要处理def __getattribute__(self, attr): obj = object.__getattribute__(self, attr) if hasattr(obj, '__get__'): return obj.__get__(self, type(self)) return obj 部分。

__setattr__