2013-06-05 225 views
0

我正在學習Python類。我在論壇上詢問了有關這方面的提示,但沒有運氣。我認爲我的實施非常糟糕。我很高興在這個新的,所以忍受我,即使我問這個問題的方式。如何在課堂外使用方法?

上面的問題是什麼,有人告訴我,我需要做的。我試過,但沒有運氣,所以我來這裏尋求幫助。

最終,我想讓我的關鍵處理程序響應我的按鍵。我以前做過這個,但我們還沒有使用類。這就是障礙所在。我應該實現類方法/變量來使它們工作,而不是使用新的變量或新的全局變量。

例如

class SuchAndSuch: 

    def __init__(self, pos, vel, ang, ang_vel, image, info, sound = None): 
     self.pos = [pos[0],pos[1]] 
     self.vel = [vel[0],vel[1]] 
     self.angle = ang 
     self.angle_vel = ang_vel 
     self.image = image 

    def update(self): 
     # this is where all the actual movement and rotation should happen 
     ... 

下面的處理程序是SuchAndSuch類外:

def keydown(key): 
    # need up left down right buttons 
    if key == simplegui.KEY_MAP["up"]: 
     # i'm supposed to just call methods here to make the keys respond??? 

    ... 

所以,所有的更新都應該在SuchAndSuch類中發生的事情,此更新調用應該是在我的keyhandler。

有人可以請他給我一個例子,當他們說這是什麼意思?所有變量(或論壇中給出的想法)我嘗試在我的關鍵處理程序錯誤中實現爲「未定義」。

+0

也許@staticmethod可以幫助你嗎? –

+3

我會仔細檢查這個問題。如果您無法訪問'SuchAndSuch'實例,我會感到驚訝。 – cwallenpoole

+0

小竅門 - '上面的問題' - 你的意思是低於? – Hannele

回答

8

有兩種方法來調用這個類外一個類的方法。更常用的方法是調用一個實例的類的的方法,像這樣:

# pass all the variables that __init__ requires to create a new instance 
such_and_such = SuchAndSuch(pos, vel, ang, ang_vel, image, info) 

# now call the method! 
such_and_such.update() 

就這麼簡單!方法定義中的self參數指向正在調用方法的實例,並作爲第一個參數隱式傳遞給該方法。您可能希望such_and_such是模塊級(「全局」)對象,因此每次按下某個鍵時都可以引用和更新同一對象。

# Initialize the object with some default values (I'm guessing here) 
such_and_such = SuchAndSuch((0, 0), (0, 0), 0, 0, None, '') 

# Define keydown to make use of the such_and_such object 
def keydown(key): 
    if key == simplegui.KEY_MAP['up']: 
     such_and_such.update() 
     # (Perhaps your update method should take another argument?) 

第二種方法是調用class method。這是可能不是你在這裏實際需要的,但爲了完整性,我將簡要地定義它:類方法綁定到class,而不是該類的實例。聲明他們使用的裝飾,讓你的方法定義是這樣的:

class SuchAndSuch(object): 
    @classmethod 
    def update(cls): 
     pass # do stuff 

然後,你可以調用這個方法沒有類的實例:

SuchAndSuch.update() 
+0

A-HA so .. for eg。 這個變量such_and_such = SuchAndSuch(pos,vel,...等)...它是在鍵處理程序? 嘗試過這種方式(請不要笑..簡直不知道我在做什麼:) 高清的keydown(鍵): such_and_suck =(POS,VEL,昂,ang_vel,圖像,信息) 如果key == simplegui.KEY_MAP [「up」]: Ship.update(self.pos) Ship.update(self.vel) NameError:name'pos'未定義 – Bianca

+0

@Bianca:您可能需要編寫' Ship.update(such_and_suck.pos)'和'Ship.update(such_and_suck.vel)'。 – martineau

+0

'pos','vel','ang'等在這裏用來演示如何創建'SuchAndSuch'的實例(副本)。很有可能您已經擁有該類的全局實例 - 您是否在現有代碼中的任何地方看到類似的東西?括號內可能有不同的值。 – Hannele