目录
一、属性的赋值
setattr表示为一个对象(类或实例)的属性就行赋值,setattr(obj, key, value) === obj.key = value 其中对实例的属性赋值优先级顺序如下: 1)如果在类中定义了__setattr__函数,则优先调用该函数。 2)如果为该属性设置了property, 则会调用property.setter, 如果不存在setter则会报错,property是一个数据描述符类。 3)如果该属性在类或父类的__dict__中,且该属性为数据描述符,则调用其__set__方法。 4)调用obj.__dict__[key] = value。 #如果类中定义了__slots__,则属性为数据描述符
二、属性的获取
getattr表示获取一个对象(类或实例)的属性值, getattr(obj, key) === obj.key 首先调用__getattribute__(属性访问拦截器),继承了object的类都有该方法,只是默认该方法不执行任何操作,直接返回, 如果在类中重写该方法,则会拦截所有的实例属性访问,不会拦截类属性的访问。 没有重写__getattribute__方法时获取实例属性值优先级顺序如下: 1)如果为该属性设置了property, 则会调用property.getter。 2)如果该属性在类或父类的__dict__中,且该属性为数据描述符,则调用其__get__方法。 3)如果属性在obj的__dict__中,则直接返回obj.__dict__[key] 4)如果属性在obj的类或父类中的__dict__中 4.1)该属性为非数据描述符,调用__get__方法 4.2)在类的__dict__中查找,放回cls.__dict__[key] 5)如果obj的类或父类中定义了__getattr__方法,则调用该方法。 获取类的属性值区别: 如果属性是一个描述符(数据或非数据)都会优先调用其__get__方法 非描述符直接调用cls.__dict__[key]
class T(object):
def func(self):
pass
使用getattr(T, "func")或T.func返回unbound method, 为方法添加了描述符,访问属性时调用__get__方法
使用T.__dict__[key]返回function