我有一个要设置很多属性的类。为了做到这一点,我做了:
opts.a = 1
opts.b = 2
# ...
opts.xyz = 0
在变量开头重复写opts.
后,我想知道:是否可以将其包装到函数或上下文中,以便将命名空间设置为类属性,以便我不是一直要写opts
吗?即我只需要做一些事情:
with opts:
a = 1
b = 2
# ...
xyz = 3
我想过将代码移到类的函数中,但这并不会使事情更容易阅读或写入,因为那时我需要编写self
而不是{{ 1}}每次。
我的情况的一个条件:应该调用类的opts
,因为我用自定义函数覆盖了它,以存储设置属性的顺序。
答案 0 :(得分:2)
如果我将您的问题和评论放在一起,您希望使用 class-as-enum 方法,但是使用可变值,您需要一种快速更新多个属性的方法,并且您想要存储设置属性的顺序。
这是我想你想要的部分实现:
<properties>
<java.mail.version>1.6.1</java.mail.version>
</properties>
...
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>${java.mail.version}</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${java.mail.version}</version>
</dependency>
根据这个定义你可以这样做:
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
的相对顺序有点令人惊讶,但由于更新发生在一个语句中,因此有一个论据可以说更新是同步的,所以相对顺序是任意的。