链过度可迭代

时间:2013-10-28 05:42:11

标签: python python-2.7

我有一个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()的返回值和类型可能已更改。

3 个答案:

答案 0 :(得分:1)

您似乎需要使用list方法

返回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])

答案 1 :(得分:1)

您可以创建课程SelectedMachines

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

因此,您可以在Control.get()中返回SelectedMachines对象:

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])

...

其中someFunction()是一种适用的方法,可重新计算一台特定机器的位置。

答案 2 :(得分: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有一个对象可以工作上。这可能是一个普遍的模式(委托人?),这是一个不寻常的形式,但仍然是相同的一般模式。