【问题标题】:Placeholder class methods Python 3占位符类方法 Python 3
【发布时间】:2013-03-09 17:21:56
【问题描述】:

我希望有一个类,其方法在其其他方法中被调用,但我希望这些方法可被覆盖并默认通过。有没有办法(很好地)做到这一点?

编辑:我对如何覆盖这些方法特别感兴趣。我试过def setup(self): ...game.setup = setup。这有点工作,但它不能与“self”参数一起正常工作,抛出 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()

【问题讨论】:

  • 请注意,“类方法”在上下文中意味着相当不同的东西。你这里的只是一个方法,没有花哨的前缀。
  • @delnan -- OP 是否对“类方法”说了些什么——我所看到的只是“我想要一个类 with 方法......”。哦,没关系。我错过了标题。
  • 如果你想要一个空方法,子类应该重写,你可以提出docs.python.org/2/library/…

标签: python oop class python-3.x pygame


【解决方案1】:

这称为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()

【讨论】:

    【解决方案2】:

    我想你可以这样做:

    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
        ...
    

    这至少减少了样板代码......

    【讨论】:

    • @PavelAnossov -- 它更改文档字符串,使它们都相同。确实,如果您确实需要在每个文档字符串上都有唯一的文档字符串,则需要将它们全部写出来(在这种情况下,AFAIK 没有很好的方法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2013-01-27
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多