python将变量绑定到特定表达式

时间:2010-05-18 11:17:55

标签: python binding

我正在开发一个简单的应用程序,它包含一个包含所有配置的文件Constants.py,就像这样

x = y

在程序执行期间,y的值发生变化,我想要x的值也得到更新,自动,这可以作为绑定参考,我该怎样才能实现呢?

4 个答案:

答案 0 :(得分:2)

在Python中,变量名称指向值。 x=y告诉Python变量名称x应该指向y当前指向的值。

当您更改y时,变量名称y指向一个新值,而变量名称x仍然指向旧值。

使用普通变量名称无法实现所需。

我喜欢KennyTM建议将x定义为函数,因为它明确表示x的值需要运行一些代码(查找y的值)。

但是,如果要保持统一的语法(使所有常量以相同的方式可访问),那么您可以使用具有属性的类(调用getter和setter函数的属性):

Constants.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')

你的script.py:

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'

y也发生了变化:

print(const.y)
# foo

答案 1 :(得分: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']

这就是python的工作方式。名称只是对象的引用。您可以使名称引用另一个名称引用的同一对象,但您不能使名称引用另一个名称。使用=运算符(a = 15)更改a引用的名称属性,因此不会影响其他名称。

答案 2 :(得分:0)

如果你的配置值在一个类中,你可以这样做:

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

然后,每次访问b时,它都会返回a。

的值

答案 3 :(得分: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

你不需要以这种方式上课,否则,我认为你需要它。