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<代码>。