2010-05-26 55 views
1

我有一個Pygame的精靈子類的方法,定義爲這樣:Python:爲什麼一個方法的行爲與添加的參數不同?

def walk(self): 
    """move across screen""" 
    displacement = self.rect.move((self.move, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     self.move = -self.move 
     displacement = self.rect.move((self.move, 0)) 
    self.rect = displacement 

我修改它,添加一個參數speed_x,現在的節目是斷開的。

def walk(self, speed_x): 
    """move across screen""" 
    displacement = self.rect.move((speed_x, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     speed_x = -speed_x 
     displacement = self.rect.move((speed_x, 0)) 
    self.rect = displacement 

之前,我這樣調用方法:

def update(self): 
     self.walk() 

現在我做:

def update(self): 
    self.walk(self.move) 

爲什麼不工作的呢?

回答

3

你不解釋它是如何「破」,但主要區別在於

speed_x = -speed_x 

,你在你的第二個版本都有,只是改變了本地變量(參數是局部變量! )speed_x,所以更改的值不會持續。

在第一個版本,

self.move = -self.move 

不改變self(其attriubtes特異性之一)和變更「持續」在未來方法,其這裏self訪問的對象上調用。

只是光禿禿的名稱之間的許多關鍵的差異(如speed_x)一個和合格的名稱(線self.move),並且,我懷疑,怎麼在這裏咬你(努力,你可以讓它通過不是說如何猜測第二個版本沒有達到你的期望)。

+0

啊,這是有道理的。謝謝。每次對象(圖像)碰到屏幕邊緣時,都不會改變方向,而只會在圖像的邊緣卡住圖像。這就是它被打破的原因。 – SteveStifler 2010-05-26 14:13:18

+0

@Steve,不客氣,總是樂於助人! – 2010-05-26 14:24:41

1

你不會將偏移存回self.move。

1

如果你想使用你的代碼的第二個版本,嘗試加入這一行:

self.move = speed_x 

在你的函數的底部。

1

正如其他人所說的,您不會在您的新代碼中更改self.move的值。我假設你修改這個函數的原因是你可以重複使用這個函數,而不是self.move

如果你希望能夠到不同的參數傳遞到你的函數,並對其進行修改,以及,你可以傳遞的speed_x修改後的值回作爲返回值:

def walk(self, speed_x): 
    """move across screen""" 
    displacement = self.rect.move((speed_x, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     speed_x = -speed_x 
     displacement = self.rect.move((speed_x, 0)) 
    self.rect = displacement 
    return speed_x 

而且這樣調用該函數如:

def update(self): 
    self.move = self.walk(self.move) 

注:這個答案假定self.move不應該總是被調用時walk更新。如果這個假設是錯誤的,並且self.move實際上應該在每次運行walk時更新,那麼您應該改用Xavier Ho的答案。

+0

我不確定我是否看到了精彩的設計或可怕的設計。爲什麼你會返回傳入的值,然後必須將參數分配給自己? – 2010-05-26 03:47:17

+0

我基於這個答案的基礎上,假設這個函數將用於'self.move'以外的值,並且該函數的其中一個作業是更新傳入參數的值。由於在Python中更新不可變參數的值是不可能的,所以參數需要在方法之外更新。我的回答是完全不合適的,如果'self.move'實際上應該更新,不管第二個參數是「walk」(我相信你的回答假設)。 – 2010-05-26 05:07:30

相關問題