2010-03-04 64 views
7

通过使用应用装饰器,可以在一个函数的框架中组织类属性。弃用应用装饰器

class Example(object): 
    @apply 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 

但现在申请已被弃用。

有没有可能实现这样的属性的简单性和可读性,新的,而不是“扩展调用语法”?


我的做法是一样的阿努拉格的,但是,我现在不女巫一个是更好的,请看:

def prop(f): 

    return property(**f()) 

class A(object): 

    @prop 
    def myattr(): 

     def fget(self): 
      return self._myattr 

     def fset(self, value): 
      self._myattr = value 

     return locals() 

回答

12

是否有可能实现的特性,例如简洁性和可读性

新的Python 2.6的方式是:

@property 
def myattr(self): 
    """This is the doc string.""" 
    return self._half * 2 

@myattr.setter 
def myattr(self, value): 
    self._half = value/2 

@myattr.deleter 
def myattr(self): 
    del self._half 
+3

我不知道这一点,我非常喜欢它。上面的'应用'魔法是如此难以理解,我不太清楚这个问题是关于什么的。 我知道@property并使用它很多,但.setter和.deleter对我来说是新的并且看起来很棒(自编档案代码:) :) – 2010-03-04 09:18:07

+0

你在getter的参数中缺少自我,不是吗? – 2011-02-20 03:27:52

+0

@大卫:正确,固定,ta。 – bobince 2011-02-26 09:41:53

0

你总是可以编写自己:

def apply(f, a): 
    return f(*a) 

但是,我不太确定我是否看到以这种方式使用apply作为装饰器的好处。什么是用例?

+1

我希望将fget/fset方法的声明放在一个函数的范围内。除了应用装饰器之外,还有其他解决方案吗? – 2010-03-04 08:06:17

2

:)这是一个聪明的用户申请,但我不确定是否有任何陷阱?

反正你能做到这一点

class Example(object): 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 
    myattr = myattr()