1. 程式人生 > >Python編程之基礎知識練習_009

Python編程之基礎知識練習_009

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         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

Python編程之基礎知識練習_009