python2中属性的访问和赋值

目录

一、属性的赋值

二、属性的获取


一、属性的赋值

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

相关博文http://www.cnblogs.com/xybaby/p/6270551.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值