2012-08-14 91 views
1

是否存在一種更加pythonic的方式來「鏈接」屬性,以便當一個類中的某個屬性發生更改時,可以根據我定義的某個關係自動更改另一個屬性?Python類:鏈接的屬性

目前,我做這樣的事情:

class myClass(object): 
    def __init__(self): 
     self.x = 1 
     self.y = 2 * self.x 
     pass 
    def set_x(self, x): 
     self.x = x 
     self.y = 2 * self.x 
     return 
A = myClass() 
print A.x #prints 1 
print A.y #prints 2 
A.set_x(5) 
print A.x #prints 5 
print A.y #automatically changes to 10 
+1

順便說一句,[推薦的Python風格(http://www.python.org/dev/peps/pep- 0008 /)是將大寫字母名稱中的所有單詞大寫,而對變量名稱使用小寫字母(用下劃線分隔),因此'a = MyClass()'而不是'A = myClass()'。 – Ghopper21 2012-08-14 01:31:55

回答

3

您可以使用屬性:

class myClass(object): 
    def __init__(self): 
     self.x = 1 

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

    @x.setter 
    def x(self, x): 
     self._x = x 
     self.y = 2 * self._x 

和測試:

>>> c= myClass() 
>>> c.x = 10 
>>> c.x 
10 
>>> c.y 
20 
+2

手動設置'__init__'的第二行不再需要。 – Ghopper21 2012-08-14 01:21:27

+0

@ Ghopper21謝謝 – JBernardo 2012-08-14 01:29:37

3

你可以使用getter和setter方法:

class myClass(object): 
    def __init__(self): 
     self.x = 1 

    @property 
    def y(self): 
     return 2 * self.x 
    ... 

基本上,這是說當你嘗試獲得A.y時,它會返回self.x * 2。

,並考慮到班上其他同學,我真的做這樣的事情:

class myClass(object): 
    def __init__(self): 
     self._x = 1 

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

    @property 
    def y(self): 
     return 2 * self._x 

    @x.setter 
    def x(self, val): 
     self._x = val 
+0

我不知道爲什麼你讓'x'屬性成功,如果你對getter和setter所做的全部都是get和set'_x'的話。我錯過了什麼嗎? – Ben 2012-08-14 02:15:21

+0

這是一個體面的點。習慣我猜。這樣,如果您稍後需要更改代碼和私有變量,則已經存在。 – Michael 2012-08-14 23:27:10