为什么托管属性仅适用于类属性而不适用于python中的实例属性?
问题内容:
为了说明问题,请检查以下代码:
class MyDescriptor(object):
def __get__(self, obj, type=None):
print "get", self, obj, type
return self._v
def __set__(self, obj, value):
self._v = value
print "set", self, obj, value
return None
class SomeClass1(object):
m = MyDescriptor()
class SomeClass2(object):
def __init__(self):
self.m = MyDescriptor()
x1 = SomeClass1()
x2 = SomeClass2()
x1.m = 1000
# -> set <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> 10000
x2.m = 1000 # I guess that this overwrites the function. But why?
# ->
print x1.m
# -> get <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> <class '__main__.SomeClass1'> 10000
print x2.m
# -> 10000
- 为什么 x2.m = 1000 不调用 set 函数?似乎这会覆盖该函数。但为什么?
- x1中的 _v 在哪里?它不在 x1._v中
问题答案:
要回答第二个问题,哪里是_v
?
您的描述符版本保留_v
在描述符本身中。描述符的每个实例(类级实例SomeClass1
以及类对象中的所有对象级实例SomeClass2
将具有不同的值)_v
。
看这个版本。此版本更新与描述符关联的对象。这意味着对象(SomeClass1
或x2
)将包含属性_v
。
class MyDescriptor(object):
def __get__(self, obj, type=None):
print "get", self, obj, type
return obj._v
def __set__(self, obj, value):
obj._v = value
print "set", self, obj, value