2011-02-16 42 views
5

这里是我想使用的模式:这个Python模式有什么“陷阱”吗?

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' 

一般来说,我更喜欢字典的get/set访问对象属性访问的语义,但也有在需要类似字典的访问某些情况下(例如,d['foo-bar'] = 'baz'),我宁愿不要为这些情况设置特殊的getter setter方法,因此,同时还需要共享属性的对象的双重行为。

是否有任何与上述模式陷阱?

+1

请参阅:http://stackoverflow.com/questions/3031219/python-recursively-access-dict-via-attributes-as-well-as-index-access – 2011-02-16 19:19:39

+1

isinstance(dict,object)`。你不需要从`object`继承。实施不仅仅是黑客行为。此外:可能重复[访问像Python中的属性字典键?](http://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute-in-python) – delnan 2011-02-16 19:21:12

回答

6

这里有一个不那么“哈克”的方式来达到同样的效果:

class Dicty(dict): 
    def __getattr__(self, key): 
     return self[key] 

    def __setattr__(self, key, value): 
     self[key] = value

认为你的方式可以很好地工作为好,但设置__dict__属性一样,似乎有点玄乎风格 - 明智的,如果其他人最终读你的代码,必然会提出一些问题。

3

请勿设置self.__dict__。在超类上调用__init__(self, *args, **kwargs)。另外,dict继承自object,因此您无需指定它。

2

一些事情。一种是如果您尝试使用字典方法,例如keys,您现在将无法获取它。我遇到了一些其他问题,比如可以腌制和可复制。

但我已经实现了一些没有这些问题的情况。你可以在这里看到它,它是dictlib.py module中的AttrDict类。该模块还包含一个类,该类可以包装另一个映射样式对象,但不能进行子类化。