2013-03-09 86 views
0

我希望有一個類在其他方法中調用的方法,但我希望這些方法是可覆蓋的,並在默認情況下通過。有沒有辦法(很好地)做到這一點?Placeholder類的方法Python 3

編輯:我特別感興趣的是我會如何去覆蓋的方法。我試過def setup(self): ...game.setup = setup。這工作有點,但它不與「自我」參數正常工作,投擲 setup() missing 1 required positional argument: 'self'

編輯2:我已經意識到我應該繼承Game並覆蓋子類中的方法。爲什麼它花了我很長時間我不知道。

如果我的話是愚蠢和混亂,這裏的一些代碼來代替:

class Game(threading.Thread): 
    def update(self): 
     pygame.display.update() 
     self.screen.fill(self.fillcolour) 

    def setup(self): 
     """Placeholder for setup""" 
     pass 

    def frame(self): 
     """Placeholder for frame""" 
     pass 

    def handleInputs(self): 
     """Placeholder for input handling""" 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       self.quit() 

    def run(self): 
     self.setup() 

     while True: 
      if self.FRAMERATE: 
       self.clock.tick(self.FRAMERATE) 

      self.frame() 
      self.update() 
      self.handleInputs() 
+0

請注意,「類方法」在上下文中的含義相當不同。你在這裏只是一個方法,沒有花哨的前綴。 – delnan 2013-03-09 17:31:36

+0

@delnan - OP是否說了一些關於「類方法」的問題 - 我看到的只是「我想用*方法創建類*」。哦,沒關係。我錯過了冠軍頭銜。 – mgilson 2013-03-09 17:34:02

+0

如果您想要一個空方法,應該覆蓋該子類,您可以引發http://docs.python.org/2/library/exceptions.html#exceptions.NotImplementedError – ninMonkey 2013-03-10 01:40:02

回答

0

這就是所謂的Template Method Pattern和你的代碼是好的。

您可能想要爲每個事件調用可重寫的方法,但不覆蓋整個handleInputs(或者每次都必須重新實現該循環)。

class Game(threading.Thread): 
    def update(self): 
     pygame.display.update() 
     self.screen.fill(self.fillcolour) 

    def setup(self): 
     """Placeholder for setup""" 
     pass 

    def frame(self): 
     """Placeholder for frame""" 
     pass 

    def handleEvent(self, event): 
     """Placeholder for input handling""" 
     pass 

    def handleInputs(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       self.quit() 
      self.handleEvent(event) 

    def run(self): 
     self.setup() 

     while True: 
      if self.FRAMERATE: 
       self.clock.tick(self.FRAMERATE) 

      self.frame() 
      self.update() 
      self.handleInputs() 
0

我想你可以這樣做:

class Whatever(object): 
    def _placeholder(self,*args,**kwargs): 
     """ 
     This function does nothing, but in a subclass, 
     it could be useful ... 
     """ 
     return 

    setup = _placeholder 
    frame = _placeholder 
    ... 

這減少了鍋爐板代碼至少...

+0

這將刪除文檔字符串。 – 2013-03-09 17:34:20

+1

@PavelAnossov - 它*改變* docstrings,使他們都是一樣的。確實,如果你確實需要在每一個文件上都有獨特的文檔,那麼你需要全部寫出來(在這種情況下,沒有辦法做到這一點)。 – mgilson 2013-03-09 17:35:48