Python: почему дескрипторы не могут быть переменными экземпляра? - PullRequest
4 голосов
/ 10 мая 2011

Скажите, я определил этот дескриптор:

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 ]

9 голосов
/ 10 мая 2011

Вы игнорируете параметр 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)
0 голосов
/ 12 сентября 2012

Не будет работать, если вы попробуете код ниже:

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

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

# where c.value also equals to "world"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...