2015-10-07 61 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))