Python编程之基础知识练习_009

Posted orcsir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Python编程之基础知识练习_009的主要内容,如果未能解决你的问题,请参考以下文章

Python编程之基础知识练习_007

Python编程之基础知识练习_004

Python编程之基础知识练习_002

Python练习题 037:Project Euler 009:毕达哥拉斯三元组之乘积

Python编程之算法练习_001

Python编程之算法练习_002