2014-12-16 1 views
8

Скажем, у меня есть очень простой тип данных:Возможно ли отслеживать список (или изменяемую последовательность), когда изменяется член списка?

class SimpleObject: 
    def __init__(self, property): 
     self.property = property 

    def update_property(self, value): 
     self.property = value 

И я особый вид списка для хранения типа данных:

class SimpleList(collections.MutableSequence): 
    def update_useful_property_of_list(self, value): 
     self.useful_property_of_list = value 

И хранить их:

simple1 = SimpleObject(1) 
simple2 = SimpleObject(2) 

simple_list = SimpleList([simple1, simple2]) 

Есть ли способ для объекта SimpleList знать, когда изменяется одно из свойств его членов? Например, как я могу получить simple_list выполнить self.update_useful_property_of_list(), когда происходит нечто подобное:

simple1.update_property(3) 
+0

Я помню, что декораторы функций - это способ справиться с этим. Это может быть направление для изучения. – BlackVegetable

+4

Это * шаблон дизайна наблюдателя *, вы можете легко найти источники об этом с помощью быстрого поиска. – utdemir

+0

что вы хотите? –

ответ

4

Как было отмечено в комментариях, вы ищете Observer design pattern. Простейшие, способ сделать это в вашем примере:

class SimpleObject: 
    def __init__(self, property, propertyChangeObserver = None): 
     self.property = property 
     self.propertyChangeObserver = propertyChangeObserver 

    def registerPropertyChangeObserver(self, propertyChangeObserver): 
     self.propertyChangeObserver = propertyChangeObserver 

    def update_property(self, value): 
     self.property = value 
     if self.propertyChangeObserver: 
      self.propertyChangeObserver.simpleObjectPropertyChanged(self) 

и:

class SimpleList(collections.MutableSequence): 
    def __init__(self, collection): 
     super(SimpleList, self).__init__(collection) 
     for e in collection: 
      e.registerPropertyChangeObserver(self) 

    def simpleObjectPropertyChanged(self, simpleObject): 
     pass # react to simpleObject.property being changed 

Потому что вы назвали ваше имущество «собственность», трудно продемонстрировать низкое сцепление здесь :) я назвал метод simpleObjectPropertyChanged для наглядности, но на самом деле SimpleList не должен знать, что он хранит SimpleObject экземпляров - ему нужно только знать, что они наблюдаемые экземпляров. Аналогичным образом SimpleObject не знает о SimpleList - он знает только о каком-то классе, который должен наблюдать его состояние (observer - отсюда и название шаблона).

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

  • Нет связанных вопросов^_^