美文网首页
python __getattr__

python __getattr__

作者: tafanfly | 来源:发表于2018-09-26 17:08 被阅读0次

    __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 __getattr__

          本文链接:https://www.haomeiwen.com/subject/lfldoftx.html