2010-03-28 42 views
3

我要實現與蟒蛇像一個動態的關係機制:如何實現這種機制:

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功能嗎?如果不是要實施一個?

回答

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 

隨着新式類和註釋,你可能可以做的更好。

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) 
3

在你的情況,c實際上是一個必須被調用的函數。 你可以使用這樣的事情:

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

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

如果你不喜歡,該方法調用時明確爲C,你可以使用普通計算器對象,它隱藏了實現:

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 
+0

+1。我喜歡你的第一種方法。 c是不是一個變量,爲什麼所有的化妝? – muhuk 2010-03-28 16:26:50

+1

但是,爲什麼不在第二個例子中簡單地執行'self._params = {}'。這不是一箇舊式的類,但它具有'__init__'的氣味。 – muhuk 2010-03-28 16:28:02

+0

@muhuk:如果我在'__init__'中完成'self._params = {}',那麼這將導致'Calc .__ setattr__'處理該命令。 '__setattr__'會調用'__setattr__',進入無限遞歸。 使用'object .__ setattr__'允許最初創建'_params',之後它可以正常使用,而不需要'__setattr__','__getattr__'或'__delattr__'處理'_params'。 – Johan 2010-03-28 16:51:51