我正在使用束类将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。
如何访问此属性?
答案 0 :(得分:4)
您可以使用getattr
:
>>> getattr(spam, 'test.this')
True
或者,您可以从对象的__dict__
获取值。使用vars
获取spam
的字典:
>>> vars(spam)['test.this']
True
答案 1 :(得分:2)
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”)