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