#__getattr__方法是拦截属性点号运算,更确切的说,当通过对未定义(不存在)属性名称和实例进行点号运算时,就会用属性名称作为字符串调用这个方法,如果能通过继承数搜索流程找到这个属性,该方法就不会被调用
class empty:
def __getattr__(self, attrname):
if attrname=='age':
return 40
else:
raise AttributeError(attrname)
x=empty()
print(x.age) #40
#x.name #报异常 builtins.AttributeError: name
#__setattr__会拦截所有的属性的赋值语句,由于对任何self属性做赋值,都会调用该方法,导致了无穷递归,必须通过属性字典做索引运算来赋值任何实例属性
class accesscontrol:
def __setattr__(self, attr, value):
if attr=='age':
self.__dict__[attr]=value
else:
raise AttributeError(attr+' not allowed')
y=accesscontrol()
y.age=40
y.name=50
class empty:
def __getattr__(self, attrname):
if attrname=='age':
return 40
else:
raise AttributeError(attrname)
x=empty()
print(x.age) #40
#x.name #报异常 builtins.AttributeError: name
#__setattr__会拦截所有的属性的赋值语句,由于对任何self属性做赋值,都会调用该方法,导致了无穷递归,必须通过属性字典做索引运算来赋值任何实例属性
class accesscontrol:
def __setattr__(self, attr, value):
if attr=='age':
self.__dict__[attr]=value
else:
raise AttributeError(attr+' not allowed')
y=accesscontrol()
y.age=40
y.name=50