3

Python 3 で OOP を練習するための簡単なチェス プログラムを作成していますが、(クラス作成前に) クラス定義の基本クラスを動的に変更する方法を知りたいと思っていました。私のクラス構造はこれです。

  • 抽象ピースクラス -> さまざまな派生ピース
  • Board クラスには、派生ピース、8x8 マトリックス、およびいくつかのメソッドの複合体があります。
  • 抽象インターフェイス クラス -> CLI または
  • 抽象インターフェイス クラス -> GUI (Tkinter もサブクラス化)
  • ゲーム クラス (ゲーム ロジックとメイン ループを処理するため)。現在、Board クラス メンバーがあります。

私は当初、 init中に定義されたインターフェイス データ メンバーを持つように Game クラスを実装しましたが、他の多くの内部ゲーム データをインターフェイス コンポジット メンバーに送信していることに気付きました。Game クラスをいずれかの Interface サブクラスのサブクラスにして、それらのメソッドに直接アクセスできるようにする (そしてそれらを抽象化する) 方がより洗練されていると思います。

ただし、これを動的に実行できるバージョンの Game クラスが必要です。これにより、コードを 2 回コーディングしたり、両方から継承したり、実行時にどの基本クラスを使用するかを決定したりする必要がなくなります。私は現在、 Game クラスを関数内にネストすることでこれを行っています。

def Game(ui):
    class Game(ui):
        ...
    return Game()

くだらないネーミングは、私がこのソリューションを気に入らない理由の一部です。通常とは違うことをしていることを明示的に使用したり確認したりせずに、Game クラスを単独で呼び出せるようにしたいと考えています。

メタクラスまたはクラス デコレータでこれを行う方法はありますか? 親クラスではなく、クラス属性に影響を与えることしかできませんでした。

4

2 に答える 2

3

classステートメントは「シンタックス シュガー」です。

type(name, bases, dict)

typeこのような動的クラスを作成できます

>>> class ui():
...     def start(self): print("Started!")
... 
>>> Game = type("Game", (ui,), {})
>>> game = Game()
>>> game.start()
Started!
于 2013-05-21T00:12:03.780 に答える
3

ここで非常に単純な metclass を使用できますが、それはやり過ぎです。必要な条件に基づいて、基本クラスとして使用しているクラスを交換するだけです。

>>> class Foo: pass
... 
>>> class Bar: pass
... 
>>> x = 3
>>> class Game(Foo if x < 3 else Bar):pass
... 
>>> Game.__bases__
(<class '__main__.Bar'>,)

これは、あなたが持っている形式主義と実際には何の違いもないことに注意してください。ただし、あなたのコードを使用する場合、Gameクラスとインスタンスをすべて関数内に作成することはありません。私は次のようなことをします:

def Game_Factory(base):
    class Game(base):
         ...
    return Game

Game1 = Game_Factory(base1)
Game2 = Game_Factory(base2)

game1_instance = Game1()
game2_instance = Game2()

これにより、クラスへのアクセスがはるかに簡単になりますGame(インスタンスを調べて取得する必要がなくなります)。

于 2013-05-21T00:12:04.590 に答える