0

list私は、与えられた画像の線の上を歩かなければならない架空のマシンを制御する Python スクリプトを持っています。

Controlすべてのインスタンスを追跡しMachine、インスタンスの位置と回転を更新するクラスがあります。画像に不完全な部分があるため、一部のインスタンスは失われる可能性があり、失われる可能性があるため、位置を「手動で」再計算する必要があります。

list問題は、関数呼び出しのチェーンを壊すことなく、オブジェクトで選択して返されたすべてのインスタンスにメソッドを適用する必要があることです。

これは私が持っているものです:

class Control:
    def __init__(self, instances):
        self.machine_instances = instances
        ...

    def get(self, elem = 0, end = None, step = 1):
        return machine_instances[elem : end : step]

    ...


class Machine:
    def __init__(self, x_position):
        ...

    def position_recalc(self):
        ...

    ...

使用方法は次のとおりです。

ml = [Machine(int(sys.argv[i])) for i in range(1, sys.argc)]
c = Control(ml)

...

c.get(2, 4).position_recalc()

OBS: メソッドのControl.get()戻り値と型が変更されている可能性があります。

4

3 に答える 3

1

メソッドlistで a のようなものを返す必要があるようですposition_recalc

class ListWithReCalc(list):
    def position_recalc(self):
        ...

class Control:
    def __init__(self, instances):
        self.machine_instances = instances
        ...

    def get(self, elem = 0, end = None, step = 1):
        return ListWithReCalc(machine_instances[elem : end : step])

それ以外の場合は、構成を使用できます

class ThingWithReCalc(object):
    def __init__(self, items):
        self.items = items()

    def position_recalc(self):
        for i in self.items():
            i.position_recalc()

class Control:
    def __init__(self, instances):
        self.machine_instances = instances
        ...

    def get(self, elem = 0, end = None, step = 1):
        return ListWithReCalc(machine_instances[elem : end : step])
于 2013-10-28T05:48:42.847 に答える
0

これを少し単純化するために自己復帰を使用します。これは、変更可能なインターフェイスを実装する 1 つの方法です。

class Control(object):
    def __init__(self, instances):
        self.focus = None
        self.instances = instances

    def get(self, start=None, end=None, slice=None):
        self.focus = (start, end, slice)
        return self

    def position_recalc(self):
        if self.focus == None:
            self.focus = (None, None, None)
        for i in self.instances.__getitem__(slice(*self.focus)):
            i.position_recalc()
        self.focus = None

c.get(2,4).position_recalc()

c.get(2,4)同じアイテムを返しますが、そのコンテキストを設定し、同じオブジェクトをユーザーに返します。これは必要なのでposition_recalc、作業するオブジェクトがあります。これにはおそらく一般的なパターンがあります (委任者?)。これは珍しい形式ですが、それでも一般的なパターンは同じです。

于 2013-10-28T19:01:00.220 に答える