class plc:
def __init__(self,name,zones):
self.list_zones=[]
self.name= name
for zone in zones:
self.list_zones.append(zone)
def actie(self):
print self.name
class zone:
def __init__(self,name,conveyors):
self.list_conveyors=[]
self.naam = name
for conveyor in conveyors:
self.list_conveyors.append(conveyor)
def actie(self):
print self.name
class conveyor:
def __init__(self,name):
self.naam = name
def actie(self):
print self.name
if __name__ == '__main__':
list_conveyors_zone_1= []
list_conveyors_zone_1.append(conveyor(1))
list_conveyors_zone_1.append(conveyor(2))
list_conveyors_zone_1.append(conveyor(3))
list_conveyors_zone_2 = []
list_conveyors_zone_2.append(conveyor(4))
list_conveyors_zone_2.append(conveyor(5))
list_zone_plc_1 = []
list_zone_plc_1.append(zone(10,list_conveyors_zone_1))
list_zone_plc_1.append(zone(20,list_conveyors_zone_2))
plc_1 = plc(1,list_zone_plc_1)
plc_1.list_zones[1].list_conveyors[1].actie()
嘿,我想编程这样,输送机的a.ctie()功能也运行输送机是其中一个元素的区域的actie(),然后这个区域运行plc的actie()是在。
我该怎么做?
答案 0 :(得分:0)
如果您正在编写一个具有__init__
和另一个函数的类,那么它几乎总是不是一个类,应该写成数据或只是普通函数。
conveyors = dict()
conveyors.['zone1'] = [1, 2, 3, 4]
conveyors.['zone2'] = [5,6]
conveyors.['plc1'] = [10, 20]
这使您可以非常轻松地参考事物。如果我想知道zone1中第三个输送机的名称:
conveyors['zone1'][2]
如果我需要获取所有输送带的名称,那么:
for zone in conveyors:
for belt in conveyors[zone]:
print(belt)
没有类,代码更具可读性,并且您不需要这么多中间值。即使使用更具描述性的名称(例如“腰带”)也能帮助读者。
来自Java背景的人习惯于强迫所有人成为一个类,因为Java需要它。如果你像Python那样编写Python,那就不太好了。
答案 1 :(得分:-1)
您需要做两件事:1)每个conveyor
对象需要存储对zone
对象的引用,每个zone
对象需要存储对plc
的引用对象。 2)conveyor.actie
只需要在其存储的zone
引用上调用该方法,同样适用于zone
及其plc
。
这样做的一种方法是更新传递给plc的每个区域,并将每个传送带传递到区域。
class Plc:
def __init__(self, name, zones):
self.list_zones = list(zones)
self.name = name
for zone in zones:
zone.plc = self
def actie(self):
print self.name
class Zone:
def __init__(self, name, conveyors):
self.list_conveyors = list(conveyors)
self.naam = name
for c in conveyors:
c.zone = self
def actie(self):
print self.name
if hasattr(self, 'plc'):
self.plc.actie()
class Conveyor:
def __init__(self,name):
self.naam = name
def actie(self):
print self.name
if hasattr(self, 'zone'):
self.zone.actie()
上面介绍了容器负责将自己添加到包含对象的方法。另一种方法是将容器传递给每个包含对象的__init__
方法,并让它自行更新。
无论引用如何实现,只需使用包含对象的方法调用容器的actie
方法即可。