我想用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并不熟悉。他有像C#这样的get,set
功能吗?如果没有实施一个?
答案 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
如果您不想将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)
答案 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
使用新的样式类和注释,您可以使其更好。