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

5 投票
2 回答
1484 浏览
提问于 2025-04-16 17:20

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

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

如果你尝试下面的代码,它是不会工作的:

class MyClass1(object):
    value = MyDescriptor()
    value2 = MyDescriptor()

c = MyClass1()
c.value = 'hello'
c.value2 = 'world'

# where c.value also equals to "world"
11

你在实现 MyDescriptor 的时候忽略了 instance 这个参数。这就是为什么它看起来像是一个类的属性。也许你想要的是这样的:

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)

撰写回答