zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU
    Hdu 5072 Coprime(容斥+同色三角形)
    HDU
    HTML常用基础标签
    简单session实现
    前端中的 IoC 理念
    怎样做页面界限
    Reset 对象属性
    SQL注入
    js:表单校验(获取元素、事件)
  • 原文地址:https://www.cnblogs.com/orcsir/p/9236609.html
Copyright © 2011-2022 走看看