假设我定义了这个描述符:
class MyDescriptor(object):
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
self._value = value
def __delete__(self, instance):
del(self._value)
我在这里使用它:
class MyClass1(object):
value = MyDescriptor()
>>> m1 = MyClass1()
>>> m1.value = 1
>>> m2 = MyClass1()
>>> m2.value = 2
>>> m1.value
2
所以value
是一个类属性,由所有实例共享。
现在,如果我定义它:
class MyClass2(object)
value = 1
>>> y1 = MyClass2()
>>> y1.value=1
>>> y2 = MyClass2()
>>> y2.value=2
>>> y1.value
1
在这种情况下,value
是实例属性,实例不共享。
为什么当value
是描述符时它只能是一个类属性,但当value
是一个简单的整数时,它会变成一个实例属性?
答案 0 :(得分:9)
您忽略了instance
实施中的MyDescriptor
参数。这就是出现成为类属性的原因。也许你想要这样的东西:
class MyDescriptor(object):
def __get__(self, instance, owner):
return instance._value
def __set__(self, instance, value):
instance._value = value
def __delete__(self, instance):
del(instance._value)
答案 1 :(得分:0)
如果您尝试以下代码,则无效:
class MyClass1(object):
value = MyDescriptor()
value2 = MyDescriptor()
c = MyClass1()
c.value = 'hello'
c.value2 = 'world'
# where c.value also equals to "world"