这主要是语法糖,但我想访问字典中的项目作为对象属性.
例:
class CoolThing(): def __init__(self): self.CoolDict = {'a': 1, 'b': 2}
而且我想拥有
my_cool_thing.a # => 1 my_cool_thing.b # => 2
编辑:具有带点符号的嵌套结构的潜在解决方案的一些代码:device.property.field
class Parameters(): def __init__(self, ids, devices): self._ids = ids self._devices = devices for p in self._devices: p = p[0] if self.__dict__.get(p.device) is None: self.__dict__[p.device] = SmartDict() else: if self.__dict__[p.device].get(p.property) is None: self.__dict__[p.device][p.property] = SmartDict() else: if self.__dict__[p.device][p.property].get(p.field) is None: self.__dict__[p.device][p.property][p.field] = ParameterData(p) class SmartDict(): def __init__(self): self.__dict__ = {} def __getitem__(self, k): return self.__dict__[k] def __setitem__(self, k, v): self.__dict__[k] = v def get(self, k): return self.__dict__.get(k) def __len__(self): return len(self.__dict__)
Wayne Werner.. 5
你想__getattr__
和__setattr__
,但你必须推出自己的类(我不知道任何建宏,不过namedtuple
,如果你并不需要太大的变化值可能工作)
class AttrDict(dict): def __getattr__(self, attr): return self[attr] def __setattr__(self, attr, value): self[attr] = value
如果您只想以这种方式访问子词典,只需更改self
为self.cool_dict
class CoolThing: def __init__(self): self.cool_dict = {'a': 1, 'b': 2} def __getattr__(self, attr): return self.cool_dict[attr] def __setattr__(self, attr, value): # Note, you'll have to do this for anything that you want to set # in __init__. if attr == 'cool_dict': super().__setattr__(attr, value) else: self.cool_dict[attr] = value
请注意,在任何其他查找失败后__getattr__
使用,但如果您想确保首先调用您的函数,则可以使用__getattribute__
还要注意的是self.cool_dict
它不上不存在CoolThing
后才__init__
被调用.我的初始版本将超出最大递归深度,因为当你创建类时,它将self.cool_dict
在init,call中设置__setattr__
,这将尝试得到self.cool_dict
它可以设置[attr] = value
它.当然它还没有找到cool_dict
,所以它会__getattr__
再次尝试再打电话......它无法找到cool_dict
并绕过它.
另一个选择是使用类级变量,但这可能根本不是你想要的:)
你想__getattr__
和__setattr__
,但你必须推出自己的类(我不知道任何建宏,不过namedtuple
,如果你并不需要太大的变化值可能工作)
class AttrDict(dict): def __getattr__(self, attr): return self[attr] def __setattr__(self, attr, value): self[attr] = value
如果您只想以这种方式访问子词典,只需更改self
为self.cool_dict
class CoolThing: def __init__(self): self.cool_dict = {'a': 1, 'b': 2} def __getattr__(self, attr): return self.cool_dict[attr] def __setattr__(self, attr, value): # Note, you'll have to do this for anything that you want to set # in __init__. if attr == 'cool_dict': super().__setattr__(attr, value) else: self.cool_dict[attr] = value
请注意,在任何其他查找失败后__getattr__
使用,但如果您想确保首先调用您的函数,则可以使用__getattribute__
还要注意的是self.cool_dict
它不上不存在CoolThing
后才__init__
被调用.我的初始版本将超出最大递归深度,因为当你创建类时,它将self.cool_dict
在init,call中设置__setattr__
,这将尝试得到self.cool_dict
它可以设置[attr] = value
它.当然它还没有找到cool_dict
,所以它会__getattr__
再次尝试再打电话......它无法找到cool_dict
并绕过它.
另一个选择是使用类级变量,但这可能根本不是你想要的:)
CoolDict
它已经存在,它的名字是__dict__
:
>>> class CoolThing(object): ... def __init__(self): ... self.__dict__['a'] = 1 ... self.__dict__['b'] = 2 ... >>> thing = CoolThing() >>> thing.a 1 >>> thing.b 2 >>> thing.c = 3 >>> thing.__dict__ {'a': 1, 'b': 2, 'c': 3}