2017-01-15 4 views
-1

Я хотел бы определить класс Integer в python, где Integer (называемый y) может быть связан с другим Integer (называемым x) и автоматически обновляться при изменении этого Integer x. Более конкретно я хотел бы иметь следующее поведениеЗависимая переменная в Python

>>> x = Integer(7) 
>>> y = x + 2 
>>> print y 
9 
>>> x.set(9) 
>>> print y 
11 
>>> z = x + y 
>>> y.set(10) 
>>> print z 
19 

я понимаю, что можно сделать это в SymPy, но я заинтересован в реализации этого сам. Я был бы признателен, если кто-нибудь может обратить внимание на то, как это можно было бы сделать самым простым способом? Спасибо.

+1

... у вас есть вопрос? Чтобы получить это поведение, вы должны по крайней мере предоставить крючки [data model] (https://docs.python.org/3/reference/datamodel.html), в данном случае '__add__'. Для «зависимых» объектов им нужно будет поддерживать ссылки друг на друга; вы знаете о симпы, почему бы не посмотреть, как они его реализуют? – jonrsharpe

+1

Определите класс и начните добавлять полезные методы. Чтобы быть даже отдаленно полезным, вам нужно будет делать такие вещи, как реализовать '__add__' и т. Д. –

ответ

2

Я не использовал SymPy раньше, но вот моя попытка:

class Integer(object): 
    def __init__(self, value_or_callback): 
     if isinstance(value_or_callback, int): 
      self._value_callback = lambda: value_or_callback 
     else: 
      self._value_callback = value_or_callback 

    @property 
    def value(self): 
     return self._value_callback() 

    def set(self, new_value): 
     self._value_callback = lambda: new_value 

    def __add__(self, other): 
     if isinstance(other, int): 
      return Integer(lambda: self.value + other) 
     elif isinstance(other, Integer): 
      return Integer(lambda: self.value + other.value) 
     else: 
      raise TypeError(other) 

    def __radd__(self, other): 
     return self.__add__(other) 

    def __repr__(self): 
     return str(self.value) 


if __name__ == '__main__': 
    x = Integer(7) 
    y = x + 2 
    print(y) 

    x.set(9) 
    print(y) 

    z = x + y 
    y.set(10) 
    print(z) 

Выход

9 
11 
19 
+0

Спасибо за четкий ответ. Это блестяще работает, и я узнал что-то новое! – hakeem

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