我正在使用的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,obj,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)
Run Code Online (Sandbox Code Playgroud)
输出为this,最后一次调用设置两个对象的值:
localhost $ python descriptor_testing.py
sally
sally
Run Code Online (Sandbox Code Playgroud)
只有一个描述符对象存储在类对象中,因此self总是相同的.如果你想存储每个对象的数据并通过描述符访问它,你要么必须将数据存储在每个对象上(可能是更好的想法),要么存储在每个对象键入的一些数据结构中(我不喜欢这个想法)尽可能多).
我会在实例对象上保存数据:
class Desc(object):
default_value = 10
def __init__(self, name):
self.name = name
def __get__(self,obj,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,obj,val):
obj.__dict__[self.name] = val
# alternatively the following; but won't work with shadowing:
#setattr(obj, self.name, val)
def __delete__(self,obj):
pass
class MyClass(object):
desc = Desc('varx')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,数据将存储在其obj's'varx'条目中__dict__.由于数据描述符查找的工作原理,您可以使用描述符"隐藏"存储位置:
class MyClass(object):
varx = Desc('varx')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当您执行查找时:
MyClass().varx
Run Code Online (Sandbox Code Playgroud)
描述符对象被调用并且可以进行查找,但是当查找如下:
MyClass().__dict__['varx']
Run Code Online (Sandbox Code Playgroud)
该值直接返回.因此,描述符能够将其数据存储在"隐藏"的位置,可以这么说.
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |