我有一个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()
的返回值和类型可能已更改。
答案 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
有一个对象可以工作上。这可能是一个普遍的模式(委托人?),这是一个不寻常的形式,但仍然是相同的一般模式。