gpt4 book ai didi

python - 将字典转换为对象时出现的问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:35 26 4
gpt4 key购买 nike

我正在使用之前在这里讨论的技术,将字典变成一个对象,这样我就可以使用点 (.) 概念访问字典的元素,作为实例变量。

这就是我正在做的:

# 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?

谢谢。

最佳答案

根据您的需要,不要将变量存储在 __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() 例程困扰您,您可以修复:

# 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()

关于python - 将字典转换为对象时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26126872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com