Как реализовать этот механизм: - PullRequest
3 голосов
/ 28 марта 2010

Я хочу реализовать механизм динамических отношений с Python что-то вроде:

a:=10
b:=30
c:=a+b
print c
a+=20
print c

выход:

40
60

c всегда является результатом a + b.
поэтому, если a или b изменятся, то c автоматически обновит значение. я пишу код на C # и делаю это с помощью механизма set и get. Теперь хочу перевести его в код Python для использования в другой программе (FontLab Studio 5). Я не очень знаком с Python. у него есть get,set функция, такая как C #? если не хо, чтобы реализовать один?

Ответы [ 4 ]

4 голосов
/ 28 марта 2010

Это, вероятно, излишне, но оно иллюстрирует, как вы должны создавать геттеры / сеттеры в Python и достигать желаемой функциональности:

class Calc(object):
    def __init__(self, a = 0, b = 0):
        self._a = a
        self._b = b

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, value):
        self._a = value

    @property
    def b(self):
        return self._b

    @b.setter
    def b(self, value):
        self._b = value

    @property
    def c(self):
        return self._a + self._b

    def __str__(self):
        return str(self.c)

calc = Calc()
calc.a = 1
calc.b = 2
print calc.c
calc.a += 10
print calc.c

Если вы не хотите делать a и b свойством, код можно упростить:

class Calc(object):
    def __init__(self, a = 0, b = 0):
        self.a = a
        self.b = b

    @property
    def c(self):
        return self.a + self.b

    def __str__(self):
        return str(self.c)
3 голосов
/ 28 марта 2010

В вашей ситуации c на самом деле является функцией, которую нужно вызывать. Вы можете использовать что-то вроде этого:

a = 10
b = 30
c = lambda: a + b

print c()
a += 20
print c()

Если вам не нравится, что вызов метода сделан явным для c, вы можете использовать общий объект Calc, который скрывает эту реализацию:

class Calc(object):
    def __init__(self):
        object.__setattr__(self,  '_params', dict())

    def __getattr__(self, name):
        param = self._params[name]
        if callable(param):
            return param()
        else:
            return param

    def __setattr__(self, name, value):
        self._params[name] = value

    def __delattr__(self, name):
        del self._params[name]

И тогда вы можете сделать:

c = Calc()
c.a = 10
c.b = 30
c.c = lambda: c.a + c.b

print c.c
c.a += 20
print c.c
2 голосов
/ 28 марта 2010

Новые классы Python поддерживают свойства .

1 голос
/ 28 марта 2010

как то так:

class C:
  def __init__(self):
    self.x = 0
    self.y = 0

  def get(self):
    return self.x + self.y

  def __str__(self):
    return self.__unicode__()

  def __unicode__(self):
    return str(self.get())

c = C()
c.x = 1
print c
c.y =2
print c

С новыми классами стилей и аннотациями вы, вероятно, сможете сделать это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...