2015-09-02 2 views
1
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() funtion конвейера также запускала actie() зоны, в которой конвейер является элементом, а затем зона запускает actie() из plc, в котором он находится.классы python, использующие функции других классов

Как я могу это сделать?

+0

[посмотреть] (https://en.wikipedia.org/wiki/Observer_pattern) –

ответ

-1

Вам нужны две вещи: 1) каждый conveyor объект должен хранить ссылку на zone объекта, и каждый zone объект должен хранить ссылку на plc объекта. 2) conveyor.actie просто необходимо вызвать метод на его сохраненной ссылке zone, а также для zone и ее 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 с помощью метода содержащегося объекта.

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, как на Java, это будет не очень хорошо.

+0

Существует хорошая видеопрезентация от PyCon 2012 под названием [Stop Writing Classes] (https://www.youtube.com/watch? v = o9pEzgHorH0) – msw

Смежные вопросы