Python面向对象实现链式调用——多个点.取属性

文章目录

  • 问题描述
  • 解决方案
  • 参考文献

问题描述

data = {
     
    'class1': {
     
        'a': {
     'Chinese': 80},
        'b': {
     'Math': 90},
    }
}

print(data)
print(data.class1)
print(data.class1.a)
print(data.class1.a.Chinese)




解决方案

继承 dict 并实现 __getattr__(self, name)

class SuperDict(dict):
    def __init__(self, *args, **kwargs):
        super(SuperDict, self).__init__(*args, **kwargs)

    def __getattr__(self, name):
        value = self[name]
        if isinstance(value, dict):
            value = SuperDict(value)
        return value

    # def __getitem__(self, item):
    #     '''[]运算符'''
    #     print('__getitem__', item)
    # return self[item]


if __name__ == '__main__':
    data = {
     
        'class1': {
     
            'a': {
     'Chinese': 80},
            'b': {
     'Math': 90},
        }
    }
    od = SuperDict(data)
    print(od)
    print(od.class1, od['class1'])
    print(od.class1.a, od['class1']['a'])
    print(od.class1.a.Chinese, od['class1']['a']['Chinese'])
    # {'class1': {'a': {'Chinese': 80}, 'b': {'Math': 90}}}
    # {'a': {'Chinese': 80}, 'b': {'Math': 90}} {'a': {'Chinese': 80}, 'b': {'Math': 90}}
    # {'Chinese': 80} {'Chinese': 80}
    # 80 80

或直接使用更强大的 EasyDict

安装

pip install easydict

代码

from easydict import EasyDict

data = {
     
    'class1': {
     
        'a': {
     'Chinese': 80},
        'b': {
     'Math': 90},
    }
}
data = EasyDict(data)

print(data['class1'].a.Chinese)
# 80




参考文献

  1. 数据模型 — Python文档
  2. python魔法函数__dict__和__getattr__的妙用
  3. python面向对象中的一些特殊__方法__
  4. python总结(五):getgetattrgetitem、__getattribute__之间的差异与联系
  5. easydict: Access dict values as attributes (works recursively)

你可能感兴趣的:(Python,python)