__getattr__

正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。

Python 有一个机制,那就是 __getattr__() 方法,可以动态返回一个属性来处理那些不存在的属性和方法。

class Student(object):

    def __init__(self, name):
        self.name = name

    def __getattr__(self, attr):
        if attr == 'score':
            return '暂无分数'
        else:
            return '该属性或方法不存在'

测试:

>>> bart = Student('bart')
>>> bart.name
'bart'

>>> bart.score
'暂无分数'

>>> bart.age
'该属性或方法不存在'

__getattr__() 方法返回函数也是完全可以的:

class Student(object):

    def __init__(self, name):
        self.name = name

    def __getattr__(self, attr):
        if attr == 'hello':
            return lambda attr : '{}: Hello! {}'.format(self.name, attr)

测试:

>>> bart = Student('bart')
>>> bart.hello('sam')
'bart: Hello! sam'

注意,只有在没有找到属性的情况下,才调用 __getattr__,已有的属性,比如 name,不会在 __getattr__ 中查找。

__getattr__ 中没有定义时,默认返回 None

>>> type(bart.abc)

你可能感兴趣的:(__getattr__)