以下是我正在考虑使用的模式:
class Dicty(dict):
def __init__(self):
self.__dict__ = self
d = Dicty()
d.foo = 'bar'
print d['foo']
>>> bar
d['foo'] = 'baz'
print d.foo
>>> 'baz'
通常,我更喜欢对象属性访问的语义而不是dict get / set访问权限,但是在某些情况下需要类似dict的访问(例如,d['foo-bar'] = 'baz'
)并且我不希望有这些情况的特殊吸气剂设定方法,因此,dict& amp;的双重行为。具有共享属性的对象。
上述模式是否有任何问题?
答案 0 :(得分:6)
这是一种不太“hacky”的方法来实现同样的效果:
class Dicty(dict):
def __getattr__(self, key):
return self[key]
def __setattr__(self, key, value):
self[key] = value
我认为你的方式也可以正常工作,但设置__dict__
这样的属性看起来有点不合时宜,并且如果有其他人必然会提出一些问题最后阅读你的代码。
答案 1 :(得分:3)
不要设置self.__dict__
。在超类上调用__init__(self, *args, **kwargs)
。另外,dict
继承自object
,因此您无需指定它。
答案 2 :(得分:2)
有几件事。一种是如果你尝试使用字典方法,例如keys
,你将无法立即获得它。我遇到了一些其他问题,例如可挑剔和可复制。
但是我已经实现了一些没有这些问题的东西。你可以在这里看到它,它是dictlib.py module中的AttrDict类。该模块还包含一个可以包装另一个映射样式对象的类,如果它不能被子类化的话。