• 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
  • 相关阅读:
    IIs和ftp
    java中HashMap重要性质和优化总结
    深入理解mysql的left join(真的很深入)
    windows bat批处理语法简析
    遍历hashMap的两种方式
    Java开发实践 集合框架 全面分析
    MySQL中日期与时间类型
    CentOS6.5下Redis安装与配置
    查看redis进程
    Web阶段:第七章:Tomcat服务器
  • 原文地址:https://www.cnblogs.com/orcsir/p/9236609.html
Copyright © 2020-2023  润新知