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

 

你可能感兴趣的:(Python)