Python中内置__getattr__()、__setattr__()和__getattribute__()方法

 

当读取对象的某个属性时,python会自动调用__getattr__()方法。例如,book.name将转换为book.__getattr__(name)。当使用赋值语句对属性进行设置时,python会自动调用__setattr__()方法,如果该属性不存在,则会调用__setattr__()对实例属性赋值,被赋值的属性和值会存入实例属性字典__dict__中。__getattribute__()的功能与__getattr__()类似,用于获取属性的值,一旦出现实例对象获取不存在的属性值,会自动调用__getattr__()方法,需要注意的是如果获取的属性存在,都会调用__getattribute__()方法,这是两种方法的区别。还有一点需要注意,如果两种方法同时进行了定义,则只会自动调用__getattribute__()方法。注意,python中并不存在__setattribute__()方法。

class Student:
    def __init__(self, sname,sno):
        self.sname = sname
        self.sno=sno
    def __getattr__(self, attr):
        return('未找到属性', attr)
xm = Student('小明',"123")
print(xm.__dict__) # 实例insA已经有classname属性了
# {'sname': '小明', 'sno': '123'}
print(xm.sname) # 由于存在属性,则不会调用__getattr__
# 小明
print(xm.grade) # grade属性没有找到,调用__getattr__
#('未找到属性', 'grade')
xm.grade="101班"    #类中不含属性grade,会调用__setattr__()对实例属性赋值,#被赋值的属性和值会存入实例属性字典__dict__中
print(xm.__dict__)
#{'sname': '小明', 'sno': '123', 'grade': '101班'}#打印实例属性字典值
print(xm.grade)
#101班

class Student:
    def __init__(self, sname,sno):
        self.sname = sname
        self.sno=sno
    def __getattr__(self, attr):
        return('__getattr__获取属性', attr)
    def __getattribute__(self, attr):
        return(' __getattribute__获取属性', attr)
xm = Student('小明',"123")
print(xm.__dict__) # 实例insA已经有classname属性了
# {'sname': '小明', 'sno': '123'}
print(xm.sname) # 虽然存在属性,则仍然调用__ getattribute __
# (' __getattribute__获取属性', 'sname')
print(xm.grade) # grade属性没有找到,则自动调用__ getattribute __
# (' __getattribute__获取属性', 'grade')

 

和__getattribute__函数是什么?它们的作用是什么? __getattr__是Python的一个特殊方法,用于在访问一个不存在的属性时触发。当我们尝试访问一个对象的属性,而该属性不存在时,Python会调用__getattr__方法来处理这个请求。可以在__getattr__方法自定义对不存在属性的处理逻辑,比如返回默认值或抛出异常。 __setattr__是Python的另一个特殊方法,用于在给对象的属性赋值时触发。当我们对一个对象的属性进行赋值时,Python会调用__setattr__方法来处理这个赋值操作。可以在__setattr__方法自定义对属性赋值的行为,比如进行一些额外的操作或进行属性值的验证。需要注意的是,在__setattr__方法对属性进行赋值时,应该调用父类的__setattr__方法来避免引起无限递归。 __getattribute__是Python的另一个特殊方法,用于获取对象的属性值。当我们尝试获取一个对象的属性时,不论这个属性是否存在,Python都会调用__getattribute__方法来处理这个请求。可以在__getattribute__方法自定义对属性的获取行为,比如进行一些额外的操作或返回特定的属性值。需要注意的是,在__getattribute__方法内部访问属性时,应该使用super().__getattribute__方法来避免引起无限递归。 总结一下: - __getattr__用于处理访问不存在属性的情况,可以自定义对不存在属性的处理逻辑。 - __setattr__用于处理属性赋值的情况,可以自定义对属性赋值的行为。 - __getattribute__用于获取属性的值,可以自定义对属性获取的行为。 参考资料: 属性相关:__getattr__函数、__setattr__函数、__getattribute__函数、__setattribute__函数和__dir__函数: - 知乎 (zhihu.com) 引用的代码示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值