Munch, 提供attribute-style 访问属性的字典

1. python源码解读之Munch

Munch 是从Bunch fork而来,功能几乎相同,它本质上是一个字典,但是提供了attribute-style 的访问属性的方式,下面是一段示例代码

from munch import Munch

b = Munch()
b.hello = 'world'
b.hello = 'world2'
print(b['hello'])       # world
print(b.hello)          # world

b['hello'] = 'hello'
b['world'] = 'world'
print(b)

这样看起来神奇的功能,实现起来却非常的简单,关键在于实现__setattr__ 和 __getattr__ 这两个方法。

通过attribute-style 方式访问属性时会调用对象的__getattr__方法,修改属性的值时会调用__setattr__方法,因此只需要在这里做一些处理就能让字典既支持通过[] 的方式访问属性也支持通过attribute-style的方式访问属性。

Munch 为我们提供了思路,那么我们可以自己简单的实现一个有类似功能的字典

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

    def __getattr__(self, key):
        if key not in self:
            raise AttributeError(key)
        else:
            return self[key]

b = Munch()
b.hello = 'world'
b.hello = 'world2'
print(b['hello'])       # world
print(b.hello)          # world

b['hello'] = 'hello'
b['world'] = 'world'
print(b)

效果几乎一致,当然,Munch 提供了更多的功能,但我认为最值得学习的就是对__setattr__ 和 __getattr__ 这两个魔法方法的使用。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案