浅谈 Python 魔法函数 __getattr__ 与 __getattribute__
魔法函数 getattr 与 getattribute 简单说明 __getattr__ 与 __getattribute__ 魔法函数的使用 目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结 书上说,天下没有不散的宴席,不要怕,书上还说了,人生何处不相逢。 ——《雪中悍刀行》 __getattr__魔法函数 _getattr_ 魔法函数是在你试图访问一个不存在的属性时调用的。 如果没有这个魔法函数,访问不存在的属性程序会报错。 from datetime import date cla 在Python编程语言中,有一些特殊的内置方法被称为“魔法函数”(Magic Methods),它们通常以两个下划线开头和结尾,例如`__getattr__`和`__getattribute__`。这两个魔法函数都涉及到对象属性的访问,但它们在处理不存在的属性时的行为有所不同。 **__getattr__魔法函数** `__getattr__`魔法函数是在尝试访问对象的一个不存在的属性时被调用。如果一个类没有定义`__getattr__`,当尝试访问不存在的属性时,Python会抛出一个`AttributeError`异常。下面是一个简单的例子: ```python class User: def __init__(self, name, birthday): self.name = name self.birthday = birthday def __getattr__(self, item): return "not find attr" user = User("无梦生7", date(1997, 1, 1)) print(user.age) # 输出: not find attr ``` 在这个例子中,`user`对象没有`age`属性,所以`__getattr__`被调用,返回字符串"not find attr"。`__getattr__`可以用来添加自定义的错误处理、默认值或者动态属性。 **__getattribute__魔法函数** `__getattribute__`魔法函数则更为底层,它会在任何情况下,无论是访问存在的还是不存在的属性时都会被调用。这意味着它会优先于`__getattr__`执行。如果你重写了`__getattribute__`,那么所有对对象属性的访问都会经过这个方法,即使属性实际存在于对象中。通常,不建议随意重写`__getattribute__`,因为它会影响到所有的属性访问,包括Python的一些内部机制。 ```python class User: def __init__(self, name, birthday): self.name = name self.birthday = birthday def __getattribute__(self, item): return "无条件优先进入" def __getattr__(self, item): return "not find attr" user = User("无梦生7", date(1997, 1, 1)) print(user.age) # 输出: 无条件优先进入 ``` 在这个例子中,`__getattribute__`总是先被调用,因此我们无法看到`__getattr__`的效果。因为`__getattribute__`返回了"无条件优先进入",所以无论属性是否存在,这个字符串都会被返回。 总结来说,`__getattr__`和`__getattribute__`在处理对象属性访问时各有侧重: - `__getattr__`仅在属性不存在时介入,可以用于提供默认值或定制错误处理。 - `__getattribute__`总是在属性访问时调用,它更底层,应当谨慎使用,避免影响正常的属性访问流程。 理解并合理利用这两个魔法函数,可以帮助我们更好地控制类的行为,实现一些高级功能,如属性的动态定义、属性的默认值、属性访问的拦截和转换等。在实际编程中,它们常常在设计元类、数据模型或者框架时发挥作用。
- 粉丝: 4
- 资源: 950
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助