python描述符跨类共享值
发布时间:2020-12-20 11:12:18 所属栏目:Python 来源:网络整理
导读:我正在使用的 python描述符是在其所有者类的所有实例之间共享其值.如何使每个实例的描述符包含其自己的内部值? class Desc(object): def __init__(self,initval=None,name='val'): self.val = initval self.name = name def __get__(self,obj,objtype): ret
我正在使用的
python描述符是在其所有者类的所有实例之间共享其值.如何使每个实例的描述符包含其自己的内部值?
class Desc(object): def __init__(self,initval=None,name='val'): self.val = initval self.name = name def __get__(self,obj,objtype): return self.val def __set__(self,val): self.val = val def __delete__(self,obj): pass class MyClass(object): desc = Desc(10,'varx') if __name__ == "__main__": c = MyClass() c.desc = 'max' d = MyClass() d.desc = 'sally' print(c.desc) print(d.desc) 输出为this,最后一次调用设置两个对象的值: localhost $python descriptor_testing.py sally sally 解决方法
存在于类对象上的只有一个描述符对象,因此self始终是相同的.如果你想存储每个对象的数据并通过描述符访问它,你要么必须将数据存储在每个对象上(可能是更好的想法),要么存储在每个对象键入的一些数据结构中(我不喜欢这个想法)尽可能多).
我会在实例对象上保存数据: class Desc(object): default_value = 10 def __init__(self,name): self.name = name def __get__(self,objtype): return obj.__dict__.get(self.name,self.default_value) # alternatively the following; but won't work with shadowing: #return getattr(obj,self.name,self.default_value) def __set__(self,val): obj.__dict__[self.name] = val # alternatively the following; but won't work with shadowing: #setattr(obj,val) def __delete__(self,obj): pass class MyClass(object): desc = Desc('varx') 在这种情况下,数据将存储在其__dict__中的obj’varx’条目中.由于数据描述符查找的工作原理,您可以使用描述符“隐藏”存储位置: class MyClass(object): varx = Desc('varx') 在这种情况下,当您执行查找时: MyClass().varx 描述符对象被调用并且可以进行查找,但是当查找如下: MyClass().__dict__['varx'] 该值直接返回.因此,描述符能够将其数据存储在“隐藏”的位置,可以这么说. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |