python中setattr用法_python 中__setattr__, __getattr__,__getattribute__, __call__使用方法

object._getattr_(self, name)

拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法

实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__。当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的。如果在__getattr__(self, attr)存在通过self.attr访问属性,会出现无限递归错误。

classClassA(object):def __init__(self, classname):

self.classname=classnamedef __getattr__(self, attr):return('invoke __getattr__', attr)

insA= ClassA('ClassA')print(insA.__dict__) #实例insA已经有classname属性了#{'classname': 'ClassA'}

print(insA.classname) #不会调用__getattr__#ClassA

print(insA.grade) #grade属性没有找到,调用__getattr__#('invoke __getattr__', 'grade')

object.__getattribute__(self, name)

实例instance通过instance.name访问属性name,__getattribute__方法一直会被调用,无论属性name是否追溯到。如果类还定义了__g

你可能感兴趣的:(python中setattr用法_python 中__setattr__, __getattr__,__getattribute__, __call__使用方法)