字典键的Javascript风格点符号不通顺?

2024-04-27 09:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始使用这样的结构:

class DictObj(object):
    def __init__(self):
        self.d = {}
    def __getattr__(self, m):
        return self.d.get(m, None)
    def __setattr__(self, m, v):
        super.__setattr__(self, m, v)

更新:基于此线程,我将DictObj实现修改为:

class dotdict(dict):
    def __getattr__(self, attr):
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

class AutoEnum(object):
    def __init__(self):
        self.counter = 0
        self.d = {}
    def __getattr__(self, c):
        if c not in self.d:
            self.d[c] = self.counter
            self.counter += 1        
        return self.d[c]

其中DictObj是可以通过点符号访问的字典:

d = DictObj()
d.something = 'one'

我觉得它比d['something']更美。注意,访问一个未定义的键返回None而不是引发一个异常,这也很好。

更新:Smashery提出了一个很好的观点,mhawke对此进行了扩展以获得更简单的解决方案。我想知道使用dict而不是定义一个新字典是否有任何不良的副作用;如果没有,我非常喜欢mhawke的解决方案。

auto Enum是一个自动递增的枚举,使用方式如下:

CMD = AutoEnum()

cmds = {
    "peek":  CMD.PEEK,
    "look":  CMD.PEEK,
    "help":  CMD.HELP,
    "poke":  CMD.POKE,
    "modify": CMD.POKE,
}

两者对我来说都很好,但我对它们感到不安。

这些事实上是坏的构造吗?


Tags: selfcmdnonegetreturnobjectinitdef
3条回答

你的DictObj例子实际上很常见。如果您处理的是“类似于对象的事物”,即它们有固定的属性名,只包含Python标识符中有效的字符,则对象样式的点表示法访问可能是一个胜利。像数据库行或表单提交这样的东西可以有效地存储在此类对象中,使代码更具可读性,而不必过多地使用[“item access”。

这个实现有点有限——你没有dict,len(),comparison,'in',iteration或nice repr的好的构造器语法。当然,您可以自己实现这些东西,但是在新样式的类世界中,您只需将dict子类化就可以免费获得它们:

class AttrDict(dict):
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

要获得默认的无行为,只需将Python2.5的collections.defaultdict类作为子类,而不是dict

这是DictObj类的一个简单版本:

class DictObj(object):
    def __getattr__(self, attr):
        return self.__dict__.get(attr)

>>> d = DictObj()
>>> d.something = 'one'
>>> print d.something
one
>>> print d.somethingelse
None
>>> 

关于DictObj,下面的方法对您有用吗?空白类允许您任意添加或替换容器对象中的内容。

class Container(object):
    pass

>>> myContainer = Container()
>>> myContainer.spam = "in a can"
>>> myContainer.eggs = "in a shell"

如果您不想在没有属性的情况下抛出attributerror,那么您认为下面的情况如何?就我个人而言,我更喜欢使用dict来表达清楚,或者使用try/except子句。

class QuietContainer(object):
    def __getattr__(self, attribute):
        try:
            return object.__getattr__(self,attribute)
        except AttributeError:
            return None

>>> cont = QuietContainer()
>>> print cont.me
None

对吧?

相关问题 更多 >