我正在使用之前讨论过的技术,将字典转换为对象,以便我可以使用点(。)概念作为实例变量访问字典的元素。
这就是我在做的事情:
# Initial dictionary
myData = {'apple':'1', 'banana':'2', 'house':'3', 'car':'4', 'hippopotamus':'5'}
# Create the container class
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
# Finally create the instance and bind the dictionary to it
k = Struct(**myData)
现在,我可以这样做:
print k.apple
结果是:
1
这样可行,但是如果我尝试将其他方法添加到" Struct"类。例如,假设我正在添加一个只创建变量的简单方法:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
def testMe(self):
self.myVariable = 67
如果我这样做:
k.testMe()
我的字典对象已损坏," myVariable"作为键插入值为" 67"。所以,如果我这样做:
print k.__dict__
我得到了:
{'apple': '1', 'house': '3', 'myVariable': 67, 'car': '4', 'banana': '2', 'hippopotamus': '5'}
有没有办法解决这个问题?我有点理解发生了什么,但不确定如果我需要完全改变我的方法并使用内部方法构建一个类来处理字典对象,还是有更简单的方法来解决这个问题?
这是原始链接: Convert Python dict to object?
感谢。
答案 0 :(得分:3)
根据您的需要,不要将变量存储在__dict__
中。请改用您自己的词典,并覆盖.__getattr__
(适用于print k.apple
)和__setattr__
(适用于k.apple=2
):
# Initial dictionary
myData = {'apple':'1', 'banana':'2', 'house':'3', 'car':'4', 'hippopotamus':'5'}
# Create the container class
class Struct:
_dict = {}
def __init__(self, **entries):
self._dict = entries
def __getattr__(self, name):
try:
return self._dict[name]
except KeyError:
raise AttributeError(
"'{}' object has no attribute or key '{}'".format(
self.__class__.__name__, name))
def __setattr__(self, name, value):
if name in self._dict:
self._dict[name] = value
else:
self.__dict__[name] = value
def testMe(self):
self.myVariable = 67
def FormattedDump(self):
return str(self._dict)
# Finally create the instance and bind the dictionary to it
k = Struct(**myData)
print k.apple
print k.FormattedDump()
k.testMe()
k.apple = '2'
print k.FormattedDump()
或者,如果您的FormattedDump()
例程困扰您,您可以修复 it :
# Initial dictionary
myData = {'apple':'1', 'banana':'2', 'house':'3', 'car':'4', 'hippopotamus':'5'}
# Create the container class
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
self.public_names = entries.keys()
def testMe(self):
self.myVariable = 67
def GetPublicDict(self):
return {key:getattr(self, key) for key in self.public_names}
def FormattedDump(self):
return str(self.GetPublicDict())
# Finally create the instance and bind the dictionary to it
k = Struct(**myData)
print k.apple
print k.FormattedDump()
k.testMe()
k.apple = '2'
print k.FormattedDump()