Python魔法方法(12):__getattr __(self, item) 方法

Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。

功能

该方法定义了用户试图访问一个不存在的属性时的行为。

参数

self 指对象本身,item 是一个字符串,代表欲访问属性的名字。

返回值

默认为 None,返回值会自动返回给触发它的对象。

示例

class MyTest:

    def __getattr__(self, item):
        return 18


sample = MyTest()
print(sample.age)
# 使用 '.' 操作符访问对象时触发此方法
print(sample.__dict__)

当 __getattribute__ 和 __getattr__ 同时存在时,会先执行 __getattribute__ 方法,若该方法能正常返回一个值,那么 __getattr__ 方法就不会被执行。若该方法没有正常返回一个值(产生了异常(AttributeError)或属性不存在),则 __getattr__ 方法就会在 __getattribute__ 之后被执行。
__getattr__()函数是特殊函数。它仅当属性不能在实例的 __dict__ 或它的类,或者祖先类中找到时,才被调用。程序员主要用 __getattr__() 来实现类的灵活性,或者用它来做一些兜底的操作。绝大多数情况下,需要的是 __getattr__()。

示例:

class Count(object):
    def __init__(self, min, max):
        self.min = min
        self.max = max
        self.current = None

    def __getattribute__(self, item):
        print(type(item), item)
        if item.startswith('cur'):
            raise AttributeError
        return object.__getattribute__(self, item)


obj1 = Count(1, 10)
print(obj1.min)
print(obj1.max)
print(obj1.current)

猜你喜欢

转载自blog.csdn.net/youzhouliu/article/details/125465531