如何实现这个机制:

时间:2010-03-28 11:11:43

标签: python

我想用python实现动态关系机制,如:

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

输出:

40
60

c总是a + b的结果 所以如果a或b改变,则c自动更新值。我在C#中编写代码,并通过setget机制执行此操作。现在想把它翻译成python代码,以便在另一个程序中使用(FontLab Studio 5)。我对Python并不熟悉。他有像C#这样的get,set功能吗?如果没有实施一个?

4 个答案:

答案 0 :(得分:4)

这可能有些过分,但它说明了如何在Python中创建getter / setter并实现所需的功能:

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

如果您不想将ab设为属性,则可以简化代码:

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)

答案 1 :(得分:3)

在你的情况下,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 :(得分:2)

新式Python类支持properties

答案 3 :(得分:1)

类似的东西:

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

使用新的样式类和注释,您可以使其更好。