从变量设置类(自)变量?

2024-06-16 16:37:36 发布

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

这是一个糟糕的编程实践,是的,我知道,但这些脚本都是我的,这种技术将大大简化我的编码。在

现在,我有一个SQLite数据库,其中包含一组表示脚本配置指令的键值对。脚本本身是一个类,我将其导入到其他脚本中。在

所以,现在,当我想访问一个配置变量时,我调用类似于:

myLib.myClass.getConfigVariable("theItemIWant")

在脚本中使用配置变量时,这会变得非常糟糕。在

所以我想简化对这些变量的访问。我可以使用一个字典,它在类加载时预先填充,并执行以下操作:

^{pr2}$

但我想得更优雅一点。我编写了一个单独的配置类,我想提供对配置项的可变级别访问。在

所以我想做的是:

^{3}$

或者在这样的脚本中实例化一个对象:

def myRoutine(self):
    cfg = myLib.Config()
    print cfg.theItemIWant

我读过一些难看的(使用exec)方法来实现这一点,我实际上对此很满意,但我不知道如何用这种方式设置类级别的变量。大多数人建议要么使用exec,要么修改vars或globals,但我不确定这是否能直接在Config类上设置变量,而不是在其他地方。在

使用exec失败:

SyntaxError: unqualified exec is not allowed in function '__init__' it contains a nested function with free variables

因此,我看到的唯一方法就是修改vars(),但我不确定这是如何应用于类的。在


Tags: 方法脚本config数据库编码sqlite编程function
3条回答

我想你想要的只是给一个成员变量赋值,比如:

class Foo(object):
      pass

cfg = Foo()
cfg.item_i_want = "An item"
print cfg.item_i_want

这将打印“项目”。参见:http://ideone.com/LDz7NK

如果要动态选择变量名,请使用setattr(cfg, "another_item_i_want", "another item")。在

一个不想重蹈覆辙的解决方案。当您只想读取config一次,并且它的结构是扁平的时,就可以工作了。在

from collections import namedtuple

def getConfig(config_source):
  # read the config_source into a dict
  # config_source might be a file name or whatnot
  config_dict = read_somehow(config_source)
  tuple_class = namedtuple('Config', config_dict.keys())
  return tuple_class(**config_dict)

该函数返回一个不可变的对象,该对象具有以配置参数名称命名的属性。在

^{pr2}$

我曾经使用这种方法来读取标准ConfigParser实例中的部分。在

您可以简单地为您的配置对象实现__getattr__()函数,例如

def __getattr__(self, name):
    if name in self.items:
         return self.items[name]
    else:
         raise AttributeError()

请参见here,以获取python文档中__getattr__()的描述。在

相关问题 更多 >