码迷,mamicode.com
首页 > 编程语言 > 详细

Python编程之基础知识练习_009

时间:2018-06-28 00:57:30      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:span   实例   font   一个   pre   class   pass   self   obj   

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

方式一:在__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

标签:span   实例   font   一个   pre   class   pass   self   obj   

原文地址:https://www.cnblogs.com/orcsir/p/9236609.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!