字典键的Javascript样式点表示法是非Python的吗?

发布于 2021-01-29 15:09:47

我已经开始使用如下构造:

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的解决方案。

AutoEnum是一个自动递增的Enum,用法如下:

CMD = AutoEnum()

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

两者都对我来说运作良好,但是我对它们感到不可思议。

这些实际上是不好的构造吗?

关注者
0
被浏览
69
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是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
    >>>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看