为了说明这个问题,请检查以下代码:
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
回答你的第二个问题,在哪里_v?
_v
您的描述符版本保留_v在描述符本身中。描述符的每个实例(类级实例SomeClass1,以及类的对象中的所有对象级实例)SomeClass2将具有不同的值_v。
SomeClass1
SomeClass2
看看这个版本。此版本更新了与描述符关联的对象。这意味着对象(SomeClass1或x2)将包含属性_v。
x2
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