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