1

他のメソッドで呼び出されるメソッドを持つクラスが欲しいのですが、それらのメソッドを上書き可能にして、デフォルトで渡すようにしたいのです。これを(うまく)行う方法はありますか?

編集:私は、メソッドをどのように正確に上書きするかに特に興味があります。私は試しましたdef setup(self): ...game.setup = setup。これは多少機能しますが、「self」パラメータでは正しく機能せず、 setup() missing 1 required positional argument: 'self'

Game編集2:サブクラスを作成し、サブクラスのメソッドを上書きする必要があることに気づきました。なんでこんなに時間がかかったのかわからない。

私の言葉が愚かで紛らわしい場合のために、代わりにいくつかのコードがあります:

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()
4

2 に答える 2

1

私はあなたが次のようなことをすることができると思います:

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

これにより、少なくともボイラープレートコードが削減されます...

于 2013-03-09T17:30:18.707 に答える
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()
于 2013-03-09T17:32:12.110 に答える