python __getattr__

__getattr__

这是python里的一个内建函数,当调用的属性或者方法不存在时,该方法会被调用

  • 调用不存在的属性
 class Student(object):
     def __getattr__(self, attr):
         if attr in ('name', 'age', 'score'):
             print attr
         else:
             raise AttributeError('Unkonw attribute : %s' % attr)


In [8]: student = Student()

In [9]: student.name
name

In [10]: student.age
age

In [11]: student.call
AttributeError: Unkonw attribute : call
  • 调用不存在的方法
 class Student(object):
     def __getattr__(self, attr):
         def _func(*arg, **kwargs):
             print arg, kwarg

         if not attr.startswith('_'):
             _func.func_name = attr
             return _func
         raise AttributeError('Unkonw attribute : %s' % attr)

In [22]: student = Student()

In [23]: student.name
Out[23]: <function __main__.name>

In [24]: student.name('a', 'b', c=1, d=2)
('a', 'b') {'c': 1, 'd': 2}
In [25]: student._age('a', 'b', c=1, d=2)

AttributeError: Unkonw attribute : _age

例一: 访问属性一样访问dict中的键值对

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

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

In [27]: obj = Dict(student={'age': 18}, name='ZhangSan')

In [28]: obj
Out[28]: {'name': 'ZhangSan', 'student': {'age': 18}}

In [29]: obj.name
Out[29]: 'ZhangSan'

In [30]: obj.student
Out[30]: {'age': 18}

In [31]: obj.student.age
Out[31]: 18
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,820评论 0 10
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,060评论 17 410
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,238评论 4 16
  • 我有一个女性朋友Y,今年40出头。她从19岁开始工作,直到去年才被提为副科长。按常理来说,工作20多年后才被稍稍提...
    最爱深深蓝阅读 179评论 0 0
  • META标签可分为两大部分:HTTP-EQUIV和NAME属性。HTTP-EQUIV用于向浏览器提供一些说明信息,...
    jack2gs阅读 991评论 0 0