爲了說明問題,請檢查下面的代碼:爲什麼託管屬性只適用於類屬性,而不適用於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__ - 功能?看來這會覆蓋功能。但爲什麼?
- _v in x1?這不是在x1._v
謝謝,這是一個好主意實施。 _v的一個問題:我也無法通過「MyDescriptor._v」訪問它 - 這很明顯,因爲它不是MyDescriptor的類屬性。但是實例的顯式名稱是什麼?它應該以某種方式訪問,對吧? – 2009-01-09 15:12:32