0

根据我之前提出的一个问题,我试图提出一个允许设置和获取的类属性。所以我写了这个并将它放在一个模块中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
>>> 

我究竟做错了什么?

(而且我已经看到它的实现有点不同。我特别想知道为什么这个实现不起作用。)

4

1 回答 1

0

医生说:

object.__set__(self, instance, value)调用以将所有者类的实例上的属性设置为新value

与 for 不同__get__,它没有提及类属性。所以 Python 不会调用任何 __set__类属性。

于 2010-09-18T19:40:41.337 回答