如何访问名称为

时间:2018-03-22 08:04:58

标签: python

我正在使用束类将dict转换为对象。

class Bunch(object):
    """ Transform a dict to an object """
    def __init__(self, kwargs):
        self.__dict__.update(kwargs)

问题是,我的名字中有一个圆点({'test.this':True})。

所以当我打电话时:

spam = Bunch({'test.this':True})
dir(spam)

我有一个名字:

['__class__',
 '__delattr__',
...
 '__weakref__',
 'test.this']

但我无法访问它:

print(spam.test.this)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-ea63f60f74ca> in <module>()
----> 1 print(spam.test.this)

AttributeError: 'Bunch' object has no attribute 'test'

我遇到了一个AttributeError。

如何访问此属性?

4 个答案:

答案 0 :(得分:4)

您可以使用getattr

>>> getattr(spam, 'test.this')
True

或者,您可以从对象的__dict__获取值。使用vars获取spam的字典:

>>> vars(spam)['test.this']
True

答案 1 :(得分:2)

实施__getitem__(self, key)

public static Bitmap getBitmapFromBytes(byte[] bytes) {
        if (bytes != null) {
            return BitmapFactory.decodeByteArray(bytes, 0 ,bytes.length);
        }
        return null;
 }

修改

我不建议直接从class D(): def __init__(self, kwargs): self.__dict__.update(kwargs) def __getitem__(self, key): return self.__dict__.get(key) d = D({"foo": 1, "bar.baz": 2}) print(d["foo"]) print(d["bar.baz"]) 实例的客户端访问d.__dict__。像这样的客户端代码

D

正试图进入d = D({"foo": 1, "bar.baz": 2}) print(d.__dict__.get("bar.baz")) 的内裤,并需要了解d的实施细节。

答案 2 :(得分:0)

正确的建议是避免在变量中使用点。 即使我们以某种方式使用,最好使用 getattr 来获取它。

getattr(spam, 'test.this')

如果我们因为避免标准而感到顽固,那么这可能会有所帮助。

class Objectify(object):
    def __init__(self, obj):
        for key in obj:
            if isinstance(obj[key], dict):
                self.__dict__.update(key=Objectify(obj[key]))
            else:
                self.__dict__.update(key=obj[key])


class Bunch(object):
    """ Transform a dict to an object """
    def __init__(self, obj, loop=False):
        for key in obj:
            if isinstance(obj[key], dict):
                self.__dict__.update(key=Objectify(obj[key]))
            else:
                self.__dict__.update(key=obj[key])


spam1 = Bunch({'test': {'this': True}})
print(spam1.test.this)

spam2 = Bunch({'test': {'this': {'nested_this': True}}})
print(spam2.test.this.nested_this)

未提供 test.this 作为密钥。您可能想要创建一个嵌套的dict,迭代通过带点的键。

答案 3 :(得分:-1)

尝试垃圾邮件[“test.this”]或spam.get(“test.this”)