2013-12-25 2 views
0

В Python, что является лучшим способом создания объектной переменной Object A, которая зависит от переменной Object B и обновляется автоматически всякий раз, когда изменяется переменная Object B?Зависимость от переменной объекта в Python

Простой пример:

class house: 
    house_size = 100 

class room: 
    room_size = 30 

house1 = house() 
room1 = room() 

house1.house_size = room1.room_size * 10 
print house1.house_size #returns 300 

room1.room_size = 50 
print house1.house_size #still returns 300, but I would like it to return 500 

В приведенном выше примере отношения между house1.house_size и room1.room_size определена. Однако это интерпретируется только один раз. Каков наилучший способ установить постоянную связь между этими двумя переменными, чтобы гарантировать, что house1.house_size обновляется автоматически, когда room1.room_size изменяется впоследствии?

Edit: Чтобы уточнить, я ищу общее решение, посредством которого объект проверяет, действительно ли все его зависимости по-прежнему «действует», когда значение его переменной объекта считывается. В приведенном выше примере переменной объекта house1.house_size зависит от room1.room_size

Вы можете думать об этих зависимостей, аналогичных приложению электронной таблицы: Например, ячейка A1 может быть определена как =B1+B2+B3 и B1 в свою очередь, может быть определена как =C1*2. Всякий раз, когда считывается значение ячейки A1, оно проверяет, изменились ли какие-либо из B1, B2 или B3. Если это так, то значение A1 будет пересчитано до того, как значение будет возвращено. Поэтому в Python я ищу обработчик событий, который запускается всякий раз, когда считывается значение house1.house_size, так что его значение может быть пересчитано перед возвратом.

Ответ должен быть достаточно общим, чтобы можно было обрабатывать все деревья зависимостей объектов, посредством чего каждый узел в дереве сам проверяет, все ли значения всех переменных объекта, от которых он зависит, все еще действительны и в противном случае пересчитываются.

+1

см [../1904351/python-observer-pattern-examples-tips](http://stackoverflow.com/questions/1904351/python-observer-pattern-examples-tips) или [это] (https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Observer) –

+1

Это очень странная объектная модель. У вас должен быть класс «House», который содержит список экземпляров класса «Room», каждый из которых имеет «размер», из которого экземпляр «House» может вычислять свой собственный размер. Кроме того, 'size' должен быть переменной экземпляра, а не переменной класса. –

+0

Просто используйте свойство. – eryksun

ответ

2

Вы должны установить связь между комнатой и моделью дома. В этом ответе я сделал объект комнаты, чтобы принять объект дома в качестве одного из параметров, и когда установлен параметр room_size, он также обновит house_size.

class house: 
    house_size = 100 

class room: 
    def __init__(self, house_object): 
     self.house_object = house_object 
     self.room_size = self.house_object.house_size/10 

    def __setattr__(self, key, value): 
     self.__dict__[key] = value 
     if key == "room_size": 
      self.house_object.house_size = self.room_size * 10 

house1 = house() 
room1 = room(house1) 

room1.room_size = 50 
print house1.house_size 
+0

Спасибо, это полезно, и '__setattr__' выглядит хорошей отправной точкой. В примере объект 'house1' зависит от объекта' room1'. Ваше решение обновляет 'house1' при изменении' room1'. Хотя это будет работать для отношений 1: 1, я ищу более общее решение, в котором на 'house1' проверяется, все ли его зависимости (включая значение' room1.room_size') по-прежнему «действительны», когда значение ' house1.house_size'. Я уточнил свой первоначальный вопрос, чтобы прояснить этот момент. – Michael

+0

@ Майкл. Вы можете взглянуть на страницу, прокомментированную behzad.nouri. – thefourtheye

+0

Спасибо, что вам понравилось, и behzad.nouri, это должно сработать. Я могу адаптировать код, размещенный на ссылках wikibook, чтобы получить желаемое поведение. – Michael

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