Почему эта реализация classprop не работает?

На основе вопроса, который я ранее спросил, я попытался придумать свойство класса, которое позволяло бы не только получать, но и устанавливать. Итак, я написал это и поместил в модуль util:

class classprop(object):
    def __init__(self, fget, fset=None):
        if isinstance(fget, classmethod):
            self.fget = fget
        else:
            self.fget = classmethod(fget)
        if not fset or isinstance(fset, classmethod):
            self.fset = fset
        else:
            self.fset = classmethod(fset)
    def __get__(self, *a):
        return self.fget.__get__(*a)()
    def __set__(self, cls, value):
        print 'In __set__'
        if not self.fset:
            raise AttributeError, "can't set attribute"
        fset = self.fset.__get__(cls)
        fset(value)

class X(object):
    @classmethod
    def _get_x(cls):
        return 1
    @classmethod
    def _set_x(cls, value):
        print 'You set x to {0}'.format(value)
    x = classprop(fget=_get_x, fset=_set_x)

Пока получение работает, настройка, похоже, не вызывается:

>>> util.X.x
1
>>> util.X.x = 1
>>> 

Что я делаю неправильно?

(И я видел реализации этого, которые работают немного по-другому. Я специально хочу знать, почему эта реализация не работает.)


person Jason Baker    schedule 18.09.2010    source источник


Ответы (1)


Документ говорит:

object.__set__(self, instance, value) Вызывается для установки для атрибута экземпляра экземпляра класса-владельца нового значения value.

В отличие от __get__ здесь не упоминаются атрибуты класса. Таким образом, Python не будет вызывать любой __set__ для атрибута класса.

person Jochen Ritzel    schedule 18.09.2010
comment
Почему X не может быть экземпляром, а type — классом? - person Jason Baker; 19.09.2010
comment
Экземпляры и типы разные, так же как и запись к ним. Python просто не реализует дескрипторы так, как вы хотите. - person Jochen Ritzel; 19.09.2010