当读取对象的某个属性时,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')