2

pygameを使って2次元の世界を動き回るシンプルなロボットのシミュレーションを作成しようとしています。世界には障害があります。ロボットには接触センサーしかありません。したがって、それが世界の境界またはその中の障害物のいずれかと衝突した場合にのみ、何かを感知することができます。したがって、ここでは衝突検出が最も重要です。

私には、WorldとRobotの2つの主要なクラスがあります。Worldクラスには、ワールドのジオメトリに関する情報が含まれ、障害物のリストも含まれています。Robotクラスには、ロボットのジオメトリと世界での現在の位置に関する情報が含まれています。ロボットは世界の一部であるため、ワールドクラスに含まれるべきだと私は信じています(しかし、私にはわかりません)。ロボットには、自分自身を表示して移動する方法があり、世界での位置が変わります。しかし、衝突検出には、境界や障害物のリストなど、世界に関する情報が必要です。

これで、WorldクラスのインスタンスをRobotクラスのメンバーにすることで、簡単なシミュレーションを実行できます。このようにして、私のロボットは世界に関する情報を取得し、衝突検出を楽しく行います。しかし、これは私を幸せにしません。

なぜなら、私は世界の他のロボットや、ロボットにさらしたくないものを世界に持ってシミュレーションを拡張したいと思うかもしれません(私はここでさまざまなAIアルゴリズムを実験しているだけです)。将来的には、ロボットが世界の知識を持たず、それを探索することで知識を得るようなものを試してみたいと思うかもしれません。

これがJavaの場合、Worldクラスが実装するインターフェイス(RobotWorldKnowledgeなど)を作成し、これをRobotクラスに渡します。このインターフェースは、ロボットが使用する世界についての選択的な知識を持っています。

Pythonでこれを行う方法がわかりません。「Pythonのインターフェース」をグーグルで試してみましたが、適切な例が見つかりませんでした。ほとんどの回答は、Pythonではインターフェースは必要ないことを示しています。

私が想定したことは間違っているかもしれません。私を助けてください。

前もって感謝します

シャヘンシャ

4

2 に答える 2

1

Pythonにはインターフェースがありません。たぶん、abcモジュールを使用して抽象基本クラスを記述し、世界のすべてのオブジェクトに抽象メソッドを実装させることができます。

たとえば、次のようになります。

import abc

class RobotWorldKnowledge(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def get_information(self, *args):
        pass

    ...


class Robot(RobotWorldKnowledge):
    def get_information(self, *args):
       ...

class World(RobotWorldKnowledge):
    def get_information(self, *args):
        ...

あるいは、ドキュメントでRobotWorldKnowledgeアイテムに言及するときは、特定のX方法で情報を返す必要がある特定の署名を持つメソッドを実装するオブジェクトを意味すると単純に述べます...したがって、ドキュメントでインターフェイスを定義し、残りはすべてダックに任せます-タイピング。

これは一般的な解決策です(標準ライブラリでよく使用されるファイルのようなオブジェクトなどを参照してください)。

于 2013-03-21T06:57:40.973 に答える
-1

Pythonには優れたインターフェイスフレームワークがありますが、基になるオブジェクトの目的のメソッドと属性のみを公開するオブジェクトプロキシのように、すばやく汚いものを作成することもできます。

__getattribute__これは、クラスで適切なメソッドを作成するだけで実行できます。

class Interface(object):
    def __init__(self, real_object, interface):
        if isinstance(interface, str):
            interface = interface.split()
        self.interface  = interface
        self.object = real_object
        Interface.validate(self)

    def __getattribute__(self, attr):
        # Retrieve the real attributes of self,
        # bypassing the normal attribute mechanism:
        interface = object.__getattribute__(self, "interface")
        real_object =  object.__getattribute__(self, "object")
        if attr in interface:
            return getattr(real_object, attr)
        raise AttributeError

    def validate(self):
        interface = object.__getattribute__(self, "interface")
        real_object =  object.__getattribute__(self, "object")
        for attr in interface:
            try:
                getattr(real_object, attr)
            except AttributeError:
                raise ValueError("Passed object does not conform to given interface")

と:

>>> class A(object):
...   a = 1 
...   b = 2
...   c = 3
... 
>>> a = A()
>>> b = Interface(a, "a b")
>>> b = Interface(a, "a b")>>> b.a
1
>>> b.b
2
>>> b.c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 16, in __getattribute__
AttributeError
>> class C(object): pass
... 
>>> Interface(C(), "a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __init__
  File "<stdin>", line 25, in validate
ValueError: Passed object does not conform to given interface
于 2013-03-21T02:52:24.757 に答える