这个Python模式有没有“陷阱”?

时间:2011-02-16 19:17:14

标签: python coding-style

以下是我正在考虑使用的模式:

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;的双重行为。具有共享属性的对象。

上述模式是否有任何问题?

3 个答案:

答案 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类。该模块还包含一个可以包装另一个映射样式对象的类,如果它不能被子类化的话。