Python编程之基础知识练习_009

练习内容:使用两种方式实现字典访问属性化:用一个类包装字典,让这个字典不使用[]访问元素,使用.点号访问元素,如同属性一样访问。

方式一:在__init__中直接操作实例字典

 1 __author__ = 'Orcsir'
 2 
 3 # 方式一
 4 class AttrDict:
 5     def __init__(self, attrs: dict):
 6         # 直接操作实例字典,避免使用魔术方法__setattr__
 7         self.__dict__.update(attrs)
 8 
 9     # 不允许修改属性
10     def __setattr__(self, key, value):
11         raise NotImplementedError
12 
13 
14 # Test
15 dct = {"x": 100, "y": 200}
16 obj = AttrDict(dct)
17 print(obj.x)
18 obj.x = 900 # Error
19 print(obj.x, obj.y)

方式二: 使用metaclass

 1 __author__ = 'Orcsir'
 2 
 3 class AttrMeta(type):
 4     def __call__(self, dct):
 5         if dct == {}:
 6             raise ValueError("AttrDict need non empty dict")
 7         setattr(self, "__init__", lambda *args: None)
 8         obj = super().__call__(dct)
 9         obj.__dict__.update(dct)
10         setattr(self, "__setattr__", lambda *args: None)
11         return obj
12 
13 
14 class AttrDict(metaclass=AttrMeta): pass
15 
16 # Test
17 dct = {"x": 100, "y": 200}
18 obj = AttrDict(dct)
19 print(obj.x)
20 obj.y = 100000 # No affect
21 print(obj.y) # keep the original value

 

posted @ 2018-06-28 00:05  Orcsir  阅读(174)  评论(0编辑  收藏  举报