【发布时间】:2014-11-25 10:30:55
【问题描述】:
我正在使用之前讨论过的一种技术,将字典转换为对象,这样我就可以使用点 (.) 概念访问字典的元素,作为实例变量。
这就是我正在做的:
# 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?
谢谢。
【问题讨论】:
-
对象实例的属性存储在所谓的 instance dict 中,可以通过
obj.__dict__访问 - 您是否故意为您的 dict 选择该名称,因为您希望它“看起来像一个真实的物体”,还是偶然的?因为如果没有,你应该只使用self._dict之类的东西(先初始化它),你会很好的。 -
或者换种说法:是的,当然
myVariable是作为您对象的__dict__的键插入的——它应该是这样工作的。这不是你想要的吗?我不明白这如何“破坏”你的听写。 -
@LukasGraf 您好,感谢您的及时回复。我刚刚按照该链接中的说明进行操作。让我试试,但我怀疑,如果我不使用
__dict__,我将无法获得.item访问权限。我现在就试试。 -
不,如果您不使用
obj.__dict__,您将无法获得点属性访问权限。但是,您可以使用namedtuple(IIRC 在另一个答案中也有一个示例)。 -
好吧,我不希望我在类中创建的每个变量都插入到字典中,我希望能够在不污染字典的情况下拥有更多内部功能。当然可以的话?
标签: python class dictionary