2015-10-07 63 views
2

我想从一个函数来创建对象的属性,这样的对象属性:试图创建功能

class A: 
    def get_x(self, neg=False): 
     if neg: 
      return -5 
     else: 
      return 5 

    x = property(get_x) 
    neg_x = property(get_x(neg=True)) 

我曾尝试以下从previous Stack Overflow post的建议,但有一个附加属性neg_x我得到这个令人困惑的错误消息:

TypeError: get_x() takes at least 1 argument (1 given) 
+0

你想用'neg_x'做什么,你想创建属性? –

+0

我认为它需要'neg_x = self.get_x(neg = True)' – jcfollower

+0

这不起作用,它说'name'self'没有被定义' – Eddy

回答

3

当您尝试分配:

neg_x = property(get_x(neg=True)) 

你实际上是调用get_x,没有self的实例,并试图将结果(这将是-5,因此不是吸气)到property。一个更简洁的方式来做到这一点是:

class A: 

    @property 
    def x(self): 
     return 5 

    @property 
    def neg_x(self): 
     return -self.x 

如果你真的想使用的功能,你可以使用例如lambda(或functools.partial)调用函数时,被访问的财产,而不是定义它的时候:

class A: 

    def get_x(self, neg=False): 
     if neg: 
      return -5 
     else: 
      return 5 

    x = property(get_x) 

    neg_x = property(lambda self: self.get_x(neg=True)) 

在使用中:

>>> a = A() 
>>> a.x 
5 
>>> a.neg_x 
-5 
0

我认为这会为你工作:只是传递价值。你的否定。检查最后一行。

class A: 
    def get_x(self, neg=False): 
     if neg: 
      return -5 
     else: 
      return 5 

    x = property(get_x) 
    neg_x = property(get_x(True))