2016-03-08 87 views
2

如何從__init__內部調用Python(v2.7)setter屬性?我寫了下面的課,但我不知道如何改變它使其工作。我得到一個AttributeError: 'test' object has no attribute '_x'異常。這裏有幾個類似的問題,但迄今爲止還找不到答案。我們的想法是,當初始化器被調用,以做一些處理/切片和分配結果的屬性從__init__在Python中調用setter

class test(object): 
    def __init__(self, a,b): 
     self._x = self.x(a,b) 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, a, b): 
     self._x = "Get this from {} and make a dataframe like {}".format(a,b) 

回答

5

self.x財產,所以你只需要直接分配給它就像你有定期屬性:

def __init__(self, a, b): 
    self.x = (a, b) 

然而,設定器給出一個對象,總是;在上面的例子中,它傳遞了一個元組;你可以解開它:

@x.setter 
def x(self, value): 
    a, b = value 
    self._x = "Get this from {} and make a dataframe like {}".format(a,b) 

value參數;這是分配被傳遞給設置者的結果。

演示:

>>> class test(object): 
...  def __init__(self, a, b): 
...   self.x = (a, b) 
...  @property 
...  def x(self): 
...   return self._x 
...  @x.setter 
...  def x(self, value): 
...   a, b = value 
...   self._x = "Get this from {} and make a dataframe like {}".format(a,b) 
... 
>>> t = test(42, 'foo') 
>>> t.x 
'Get this from 42 and make a dataframe like foo' 
+0

啊我看!非常好,現在工作很好,非常感謝。我的IDE Pycharm抱怨說實例屬性_x是在__init__之外定義的,我已經在初始化程序中將它指定爲None,然後用'self._x = None'調用setter。我想這就好了,對吧? – Aenaon

+1

@Aenaon如果將'__init__'函數改爲使用'self._x = self.x =(a,b)'行而不是將其實例化爲'None',它可能會看起來更漂亮。 –

+0

謝謝Jared,很好! – Aenaon