一段代码
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实现属性私有化的首选方式。