2010-09-18 53 views
0

根据a question I previously asked,我试图想出一个类属性,可以设置以及获取。所以我写了这一点,并把它放在一个模块util在:为什么这个classprop实现不起作用?

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 
>>> 

我在做什么错?

(我已经看到了这一点,工作有一点不同的实现方式。我专门想知道为什么实现不工作。)

回答

0

The doc's say:

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

不像__get__,它没有提到类属性。因此Python不会在类属性上调用的任何__set__

+0

为什么'X'不是实例,'type'是类? – 2010-09-18 20:03:38

+0

实例和类型不同,写入它们也是如此。 Python只是不按照你希望的方式来实现描述符。 – 2010-09-18 20:27:35