Python 3 占位符类方法

2 投票
2 回答
4218 浏览
提问于 2025-04-17 18:31

我想创建一个类,这个类里面有一些方法,这些方法可以在其他方法中被调用。但我希望这些方法可以被重写,并且默认情况下可以不执行。有没有什么好的方法可以做到这一点呢?

补充说明:我特别想知道具体该怎么重写这些方法。我试过用 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()

2 个回答

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

这样可以减少一些重复的代码...

1

这被称为 模板方法模式,你的代码是没问题的。

不过,你可能想要为每个事件调用一个可以被重写的方法,而不是每次都重写整个 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()

撰写回答