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

时间:2018-04-10 12:37:07

标签: python

我有一个要设置很多属性的类。为了做到这一点,我做了:

opts.a = 1
opts.b = 2
  # ...
opts.xyz = 0

在变量开头重复写opts.后,我想知道:是否可以将其包装到函数或上下文中,以便将命名空间设置为类属性,以便我不是一直要写opts吗?即我只需要做一些事情:

with opts:
   a = 1
   b = 2
     # ...
   xyz = 3

我想过将代码移到类的函数中,但这并不会使事情更容易阅读或写入,因为那时我需要编写self而不是{{ 1}}每次。

我的情况的一个条件:应该调用类的opts,因为我用自定义函数覆盖了它,以存储设置属性的顺序。

1 个答案:

答案 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的相对顺序有点令人惊讶,但由于更新发生在一个语句中,因此有一个论据可以说更新是同步的,所以相对顺序是任意的。