Python編程之基礎知識練習_009
阿新 • • 發佈:2018-06-28
ret per 使用 sel pass lambda self val self.
練習內容:使用兩種方式實現字典訪問屬性化:用一個類包裝字典,讓這個字典不使用[]訪問元素,使用.點號訪問元素,如同屬性一樣訪問。
方式一:在__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 ifdct == {}: 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 classAttrDict(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
Python編程之基礎知識練習_009