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')

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值