当我制作"数据"变量一个类变量,以下工作,但当我使它成为一个对象变量时,不会调用该描述符。请帮忙。
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()
答案 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__