Python:为什么描述符不能成为实例变量?

时间:2011-05-10 03:20:10

标签: python scope descriptor

假设我定义了这个描述符:

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是一个简单的整数时,它会变成一个实例属性?

2 个答案:

答案 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"