Python 高级编程和异步IO并发编程 --08_2 __getattr__,__getattribute__魔法函数

# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,name,birthday):
        self.name = name
        self.birthday = birthday

if __name__ == "__main__":
    user = User("Tom", date(year=1987, month=1, day=1))  # date 接收三个参数,year/month/day
    print(user.age)   # 此处调用一个不存在的age属性,执行会报告 AttributeError: 'User' object has no attribute 'age'
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,name,birthday):
        self.name = name
        self.birthday = birthday

    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
        return "not find attr"

if __name__ == "__main__":
    user = User("Tom", date(year=1987, month=1, day=1))  # date 接收三个参数,year/month/day
    print(user.age)   # 调用不存在的age属性时,程序并没有报错,而是调用魔法函数__getattr__,报告not find attr
    print(user.name)  # 执行该语句时,则不会进入__getattr__,直接返回查找到的结果 Tom
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,name,birthday):
        self.Name = name            # 假设这里写错,将self.name 写成self.Name
        self.birthday = birthday

    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
        return self.Name

if __name__ == "__main__":
    user = User("Tom", date(year=1987, month=1, day=1))  # date 接收三个参数,year/month/day
    print(user.name)  # 执行该语句时,会进入__getattr__,完成代码的纠错,返回查找到的结果 Tom
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,name,birthday,info={}):  # 假设此处还需要传入一个dict,用户更详细的信息
        self.name = name            # 假设这里写错,将self.name 写成self.Name
        self.birthday = birthday
        self.info = info

    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
        return self.info[item]    # 如果没有此处定义,调用会出错

if __name__ == "__main__":
    user = User("Tom", date(year=1987, month=1, day=1),info={"company_name":"ABC"})  # date 接收三个参数,year/month/day
    print(user.company_name)  # 执行该语句时,会进入__getattr__,返回调用的value ABC
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,info={}):  # 假设此处还需要传入一个dict,用户更详细的信息
        self.info = info

#    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
#        return self.info[item]    # 如果没有此处定义,调用会出错

if __name__ == "__main__":
    user = User(info={"company_name":"ABC","name":"CDE"})  # date 接收三个参数,year/month/day
    print(user.name)  # 执行会报错,AttributeError: 'User' object has no attribute 'name'
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用

from datetime import date,datetime

class User:
    def __init__(self,info={}):  # 假设此处还需要传入一个dict,用户更详细的信息
        self.info = info

    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
        return self.info[item]    # 如果没有此处定义,调用会出错

if __name__ == "__main__":
    user = User(info={"company_name":"ABC","name":"CDE"})  # date 接收三个参数,year/month/day
    print(user.name)  # 有了魔法函数的处理逻辑,此处即可以返回查询结果 CDE'
# 魔法函数是python解释器内部使用的方法,是整个python动态特性的最根本原因。
# __getattr__与__getattribute__的区别:
# __getattr__在查找不到属性的时候调用
# __getattribute__: 只要用self.xxx 访问,首先进入的就是__getattribute__,无条件的进入该函数

from datetime import date,datetime

class User:
    def __init__(self,info={}):  # 假设此处还需要传入一个dict,用户更详细的信息
        self.info = info

    def __getattr__(self,item):   # 只有当调用一个无法查找到的属性时,才会调用__getattr__
        return self.info[item]    # 如果没有此处定义,调用会出错

    def __getattribute__(self,item):  # 该方法,能不重写,最后不要重写。否则后患无穷
        return "test"

if __name__ == "__main__":
    user = User(info={"company_name":"ABC","name":"CDE"})  # date 接收三个参数,year/month/day
    print(user.test)  # 调用一个不存在的属性,也无条件进入__getattribute__,返回 test

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值