Python更改命名空间以访问类的属性

Python更改命名空间以访问类的属性,python,Python,我有一个需要设置很多属性的类。为此,我要: opts.a = 1 opts.b = 2 # ... opts.xyz = 0 在反复编写opts.变量开始时,我想知道:是否可以将其包装到函数或上下文中,以便将名称空间设置为类属性,这样我就不必一直编写opts?也就是说,我只需要做以下事情: with opts: a = 1 b = 2 # ... xyz = 3 我曾想过将代码移动到类的函数中,但这并不能使读写更容易,因为那时我需要编写self,而不是每次都选

我有一个需要设置很多属性的类。为此,我要:

opts.a = 1
opts.b = 2
  # ...
opts.xyz = 0
在反复编写
opts.
变量开始时,我想知道:是否可以将其包装到函数或上下文中,以便将名称空间设置为类属性,这样我就不必一直编写
opts
?也就是说,我只需要做以下事情:

with opts:
   a = 1
   b = 2
     # ...
   xyz = 3
我曾想过将代码移动到类的函数中,但这并不能使读写更容易,因为那时我需要编写
self
,而不是每次都选择
opts


我的例子的一个附带条件是:应该调用类的
\uuuu setattr\uuuu
,因为我确实使用自定义函数来覆盖它,以存储属性设置的顺序。

如果我将您的问题和注释放在一起,您希望使用类作为枚举方法,但使用可变值,您需要一种快速更新多个属性的方法,并且需要存储属性设置的顺序

下面是一个部分实现,它实现了我认为您需要的功能:

class MyClass:
    def __init__(self):
        self.__dict__['values'] = collections.OrderedDict()
    def __setattr__ (self,a,v):
        self.__dict__['values'][a]=v
    def __getattr__ (self,a):
        return self.__dict__['values'][a]
    def __repr__(self):
        return repr(self.__dict__['values'])
根据此定义,您可以执行以下操作:

>>> m = MyClass()
>>> m.z = 56
>>> m.y = 22
>>> m.b = 34
>>> m.c = 12
>>> m
OrderedDict([('z', 56), ('y', 22), ('b', 34), ('c', 12)])
快速更新:

>>> m.values.update(f=2, g=3, h=5)
>>> m
OrderedDict([('z', 56), ('y', 22), ('b', 34), ('c', 12), ('h', 5), ('g', 3), ('f', 2)])

确实,
f
-
g
的相对顺序有点令人惊讶,但是由于更新发生在一个语句中,因此有一个论点可以说更新是同时进行的,因此相对顺序是任意的。

您可以定义一个上下文管理器来实现这一点,但这是一个糟糕的设计。如果你有太多的属性,你可能会有一个设计问题,而不是一个dict/列表更适合吗?我不明白。为什么
a
b
。。。未在
\uuuu init\uuuu
中设置?如果允许默认参数,则不必向构造函数提供所有属性。@hiroprotation否,我希望调用
\uuuu setattr\uuuu
。它将attr键存储在一个有序列表中,这样我就可以按属性的顺序调用属性stored@Honeybear也许您应该考虑将类作为EnUM方法放弃,而不是<代码>有序DICT<代码>。