与模块中定义的对象共享变量的python方法有哪些?

2024-09-30 04:39:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个模块,其中有很多不同的对象需要由几个变量控制。在

如果这是C语言,我会给对象一个指向我希望它们监视的变量/对象的指针,让应用程序根据需要更改变量,模块中的对象将“看到”新值。在

模块内食品公司名称:

class foo(object):
  def __init__(self, varToWatch):
    self.varToWatch = varToWatch
  def DoSomething(self):
    print self.varToWatch

在应用中,棒.py公司名称:

^{pr2}$

当然,这不起作用,因为x的原始值(或者对x的原始值的引用?)存储在y中,得到“before”和“before”。在

所以,我试着。。。在

  1. 传递全局的名称,并在foo中通过名称引用全局。不行,因为全局在应用程序的空间中,而不是在模块中。在
  2. 在foo名称空间中使用一个全局变量,但是我不知道如何通过变量名来寻址该空间,我们目前正在从foo导入*而不是导入foo。改变这一点是痛苦的。在
  3. 在模块中创建一个字典,并将字典中键的名称传递给模块中的对象。从应用程序操作字典的内容。基本上,我定义了一个新的全局空间并在其中添加变量。我看不出有什么不起作用的,但我觉得它不整洁。只是我不熟悉Python吗?在

我发现Python没有找到我习惯的那种漂亮的解决方案,所以我怀疑我遗漏了一些东西。在

建议?在

TIA公司, -蒂姆。在


Tags: 模块对象self名称应用程序字典foodef
3条回答

把控制变量放在一个单独的模块中——比如说,settings——然后做一个单独的import settings?然后,您可以让您的对象监视settings.barsettings.quux,同时仍在执行from foo import *来扰乱主命名空间。;—)也可以使用全局对象来存储设置,效果基本相同。在

当然,对于这样的问题,人们一定想知道,从长远来看,重组事物来做一个import foo是否没有帮助。。。不过,在不知道问题的情况下无法做出判断,所以我将把这个问题留给你。在

要捕获一个名称的所有重新绑定,您需要同时传递一个名称空间一个特定名称作为其中的键。使用专用的dict作为名称空间是可以的,但是对于整个模块(可以作为globals())或任何要观察其属性的特定对象o使用{}也可以。在

所以:

class foo(object):
  def __init__(self, namespace, name):
    self.namespaceToWatch = namespace
    self.nameToWatch = name
  def DoSomething(self):
    print self.namespaceToWatch[self.nameToWatch]

对于您的示例,由于您处于全局级别:

^{pr2}$

诀窍是使用可变类型。字符串是不可变的,因此当您更改字符串时,它会在新的内存空间中创建一个新的字符串对象。但是,如果引用了一个列表并将其附加到该列表中,则内存空间不会更改。调整你的代码。。。在

>>> class Foo(object):
...     def __init__(self, var):
...         self.var = var
...     def show(self):
...         print self.var
... 
>>> x = ['before']
>>> y = Foo(x)
>>> y.show()
['before']
>>> x.append('after')
>>> y.show()
['before', 'after']

相关问题 更多 >

    热门问题