python关于__setattr__()和__getattr__()和__getattribute__()一些个人感想

一段代码

class Student:
    def __init__(self,sname,sno):
        self.sname=sname
        self.sno=sno
    def __getattr__(self,attr):#拦截点号运算.当对未定义的属性名称和实例进行点号运算时
        return "未找到属性%s"%attr#将未定义实例属性名传入attr参数中,并进行方法调用,如果
                               #如果继承树可以找到该属性,则不调用此方法
        
    def __setattr__(self,attr,value):#拦截所有实例属性的赋值语句,当使用赋值语句对属性
        self.__dict__[attr]=value    #进行设置时,python会自动调用__setattr__()方法
        print("调用__setattr__()")   #如果该实例属性不存在,则会调用__setattr__()对
                                     #实例属性赋值,被赋值的属性和值会存入实例属性字典
                                     #__dict__中
    def __getattribute__(self,attr):
        print("调用__getattribute__()方法")
        return object.__getattribute__(self,attr)
        
s=Student("斌哥","19")
print(s.__dict__)#输出{'sname': '斌哥', 'sno': '19'},返回字典形式(注意)
print(s.sage)#s对象无该实例属性,调用__getattr__(),
s.sage="19"#此时可以依据python的动态语言特性,为s实例对象动态赋属性,调用__setattr__
print(s.__dict__)#输出{'sname': '斌哥', 'sno': '19', 'sage': '19'},返回字典形式(注意)
print(s.sage)#s对象存在该实例属性,不调用__getattr__()

一段思考

__getattr__()与__getattribute__()区别:
__getattribute__()与__getattr__()功能类似,用于获取属性值,当实例对象获取不存在的实例属性
时,会自动调用__getattr__()方法,当实例对象获取存在的实例属性时,则会调用__getattribute__()
方法,此外,如果该两种方法同时定义,则只会调用__getattribute__()方法,python中并不存在
__setattribute__()方法

总结:上述方式是python实现属性私有化的首选方式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值