python类使用其他类的函数

时间:2015-09-02 18:49:42

标签: python

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()是在。

我该怎么做?

2 个答案:

答案 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方法即可。