0

我有一个 Python 脚本,它控制list必须在给定图像的线条之上行走的假想机器。

我有一个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

看起来你需要listposition_recalc方法返回类似 a 的东西

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 回答
1

你可以创建一个类SelectedMachines

class SelectedMachines:
    def __init__(self, selected):
        self.selected_machines = selected
    def position_recalc(self):
        for machine in self.selected_machines:
            machine.someFunction()

所以你可以返回一个 SelectedMachines 对象Control.get()

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

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

...

WheresomeFunction()是一种应用重新计算特定机器位置的方法。

于 2013-10-28T05:51:18.957 回答
0

使用自我返回来简化这一点。这是实现可修改接口的一种方法:

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 回答