魔法函数__getattr__(有条件执行)和 __getattribute__(无条件执行)区别

#__getarr__,__getattribute__
#__getattr__就是在查找不到属性的时候调用
from datetime import date
class User:
    def ___init__(self,name,brithday,info={}):
        self.name=name
        self.brithday=brithday
        self.info=info

    def __getattr__(self, item):
        return self.info[item]

if __name__ == '__main__':
    user=User("boddy",date(year=1987,month=11,day=1),info={"company_name":"imooc"})
    print(user.company_name)

 __getattribute__尽量不使用  ,在设计类时候可以实例化对象时候使用。访问属性的方法,我们可以通过方法重写来扩展方法的功能。

调用方法其实是类里面的一个同名属性指向了一个函数(方法),返回的是函数的引用,再用   函数()    这种方式就可以调用它 

在调用实例的方法的时候,实际上给对象传过去的只是一个字符串而已。

无论调用属性还是方法,都是先强制调用 __getattribute__ 方法,然后再传回属性的值或者是 函数(方法)的引用.

注意,在 __getattribute__ 方法里面 如果再用类似 self.*** 这种调用方式 ,那么是一件很不好的行为,因为 每次调用类的属性都会强制调用 __getattribute__ ,所以极有可能造成递归调用。

_getattribute__ 方法功能:

1 调用属性会触发该功能,属性存在则会返回相应的值;
2 如果属性不存在则会抛出异常AttributeError,所以可以自定义异常信息
3 存在__getattr__,若有异常出现则会传递给__getattr__用来接收,执行操作

1.__getattribute__方法优先级比__getattr__高

2.只有在__getattribute__方法中找不到对应的属性时,才会调用__getattr__

3.如果是对不存在的属性做处理,尽量把逻辑写在__getattr__方法中

4.如果非得重写__getattribute__方法,需要注意两点:第一是避免.操作带来的死循环;第二是不要遗忘父类的__getattribute__方法在子类中起的作用
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值