我正在开发一个简单的应用程序,它包含一个包含所有配置的文件Constants.py,就像这样
x = y
在程序执行期间,y的值发生变化,我想要x的值也得到更新,自动,这可以作为绑定参考,我该怎样才能实现呢?
答案 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
你不需要以这种方式上课,否则,我认为你需要它。