2010-05-18 25 views
2

我開發的簡單應用程序包含所有配置的文件Constants.py,它是這樣蟒到特定表達

x = y 

程序的執行,在此期間HAVA變量的結合,Y的值改變時,我希望XO的價值得到太多更新,自動,這可以下文稱結合,我怎麼能做到這一點

+1

'def x():return y'? – kennytm 2010-05-18 11:35:34

回答

2

在Python中,變量名指向值。 x=y告訴Python變量名稱x應該指向y當前指向的值。

當您更改y時,則變量名稱y指向一個新值,而變量名稱x仍指向舊值。

你不能用簡單的變量名實現你想要的。

我喜歡KennyTM的建議,將x定義爲函數,因爲它明確指出x的值需要運行一些代碼(查找y的值)。

但是,如果你要保持均勻的語法(使所有以同樣的方式訪問的常數),那麼你可以使用與(其中調用getter和setter函數屬性)屬性的類:

常量。 py:

class BunchOConstants(object): 
    def __init__(self, **kwds): 
     self.__dict__.update(kwds) 
    @property 
    def x(self): 
     return self.y 
    @x.setter 
    def x(self,val): 
     self.y=val 
const=BunchOConstants(y=10,z='foo') 

您的腳本。潘岳:

import Constants 

const=Constants.const 
print(const.y) 
# 10 
print(const.x) 
# 10 

在這裏你改變 「常數」 Y:

const.y='bar' 

與 「不變」 x過改變:

print(const.x) 
# bar 

您可以更改x

const.x='foo' 

and y也改變了:

print(const.y) 
# foo 
0

如果更改值(對象)本身,那麼對它的所有引用將被更新:

>>> a = [] 
>>> b = a # b refers to the same object a is refering right now 
>>> a.append('foo') 
>>> print b 
['foo'] 

但是,如果你把名字點到一些其他的對象,那麼其他的名字仍然會引用什麼,他們之前引用:

>>> a = 15 
>>> print b 
['foo'] 

這是蟒蛇是如何工作的。名稱只是對象的引用。您可以使用其他名稱引用的同一對象進行名稱引用,但不能使名稱引用其他名稱。使用=運算符(a = 15)的名稱歸屬更改a引用的內容,因此它不會影響其他名稱。

0

如果你的配置值是一類裏面,你可以做這樣的事情:

>>> class A(object): 
...  a = 4 
...  @property 
...  def b(self): 
...   return self.a 
... 

然後,每次訪問B時間,它會返回一個值。

0

有一個簡單的解決方案,你可以做。只需定義一個屬性並請求您定義的fget值。

例如:

a = 7 

@property 
def b(): 
    return a 

如果你問B,你會得到這樣的事情<property object at 0x1150418>但如果這樣做b.fget(),您將獲得價值7

現在試試這個:

a = 9 
b.fget() # this will give you 9. The current value of a 

你不需要有這樣的課,否則,我認爲你會需要它。