2016-08-15 80 views
-1

假設我在Python中定義了以下類。Class實例的奇怪行爲 - 更新內部變量

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = self.x ** 2 
    def check(self): 
     self.x = self.x + 1 
     print self.x 
     print self.y 

這裏我有兩個內部變量x和y。在初始化中,我設置了$$ y = x^2 $$。現在,每次我調用方法check()時,它都會將x的值增加1:self.x = self.x + 1。但是,當我打印值x正確地增加1,但y始終保持爲0。 (不應該是x^2 ??)怎麼回事?

+0

沒有什麼是錯的。初始化實例後,您永遠不會更改'self.y',因此它保留了它始終具有的相同值。 – kindall

+0

我強烈推薦Ned Batchelder的「[關於Python名稱和值的事實和神話](http://nedbatchelder.com/text/names1.html)」(26分鐘[來自PyCon US 2015的視頻](https:// www。 youtube.com/watch?v=_AEJHKGk9ns)),瞭解Python變量和賦值語句與大多數其他語言完全不同的速成課程。 (具體來說,名稱總是指向值,_永遠指向表達式或其他名稱。) –

回答

2

您的self.y僅在您的第一個創建您的班級的實例時才分配。每次調用函數時都不會更新。 def __init__(self):函數僅在執行
myVar = new test()時執行,因此y的值只分配和更新一次。

您的代碼將需要:

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = self.x ** 2 
    def check(self): 
     self.x = self.x + 1 
     self.y = self.x ** 2 
     print self.x 
     print self.y 
2

Python是不是像一個電子表格,更新一個單元格(可變)可以自動影響其他人的價值觀。

初始化後,代碼從不更改self.y的值。您需要添加一些代碼來完成此操作,例如

def check(self): 
     self.x = self.x + 1 
     self.y = self.x ** 2 
     print self.x 
    print self.y 

有一種辦法,雖然實施該行爲:使用properties

class Test(object): 
    def __init__(self): 
     self._x = 0 
     self.y = 0 

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

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

    def check(self): 
     self.x = self.x + 1 
     print self.x, self.y 

>>> t = Test() 
>>> for i in range(5): 
...  t.check() 
1 1 
2 4 
3 9 
4 16 
5 25 

>>> t.x = 200 
>>> t.y 
40000 

如果你想你也可以實現y作爲一個屬性,把它設置x其平方根當它更新時。這將強制執行x是`y``的平方根的關係,反之亦然。

0

變量y僅在實例化時設置,並且未在代碼中更新。

您應該有單獨的方法來更新和/或增加x並根據需要調整y以及檢查值的方法。

class test(): 
    def __init__(self): 
     self.x = 0 
     self.y = 0 
    def update_x(self, x): 
     self.x = x 
     self.y = x ** 2 
    def increment_x(self): 
     self.x += 1 
     self.y = self.x ** 2 
    def check(self): 
     print self.x 
     print self.y