python __setattr__、__getattr__、hasattr、getattr、setattr函数

 __getattr__

从对象中读取某个属性时,先从__dicts__属性中寻找,再从__getattr__中查找。在这一过程中,__getattr__被自动调用了。

In [43]: class A:
    ...:     def __init__(self):
    ...:         self.name = 'from __dicts__'
    ...:     def __getattr__(self,item):
    ...:         if item == 'name':
    ...:             return 'from __getattr__'
    ...:         elif item == 'age':
    ...:             return 26
    ...:

In [44]:

In [44]: a=A()

In [45]: a.name
Out[45]: 'from __dicts__'

In [46]: a.age
Out[46]: 26
__setattr__

为对象设置某个属性时,先从__dicts__属性中寻找,再从__setattr__中寻找。在这一过程中,__setattr__被自动调用了。

In [51]: class A:
    ...:     def __setattr__(self,item,value):
    ...:         if item == 'name':
    ...:             print('fun setattr')
    ...:             object.__setattr__(self,item,value)
    ...:     def __init__(self):
    ...:         self.id = 10
    ...:

In [52]: a = A()
In [57]: a.name='Abbie'
fun setattr

In [58]: a.id = 20

hasattr
语法:hasattr(object,name)
hasattr是python内置函数,用来判断对象是否有该属性或者方法。其返回值为布尔型。

In [64]: class A:
    ...:     some = 1
    ...:

In [65]: a = A()

In [66]: hasattr(a,'some')
Out[66]: True

In [67]: hasattr(a,'name')
Out[67]: False

getattr
语法:getattr(object,name[,defualt])
getattr是python的内置函数,用来获取对象的属性和方法。如果获取的是属性,则返回该属性值,若是方法,可以加括号进行调用。若属性不存在且没有赋默认值,报错。属性存在,且有默认值,返回默认值。
eg:

In [16]: class A:
    ...:     some = 2
    ...:     def _out(self):
    ...:         print('output self')
    ...:     def _input(self,value):
    ...:         print('input ',value)
    ...:
    ...:
    ...:

In [17]: a = A()

In [18]: getattr(a,'some')
Out[18]: 2

In [19]: getattr(a,'_input')(1)
input  1

In [20]: getattr(a,'age')
-----------------------------------------------------------------------
AttributeError                        Traceback (most recent call last)
<ipython-input-20-d2ac046ed582> in <module>()
----> 1 getattr(a,'age')

AttributeError: 'A' object has no attribute 'age'

In [21]: getattr(a,'age','18')
Out[21]: '18'

还有一种情况就是传入的对象是一个函数。这样一来getattr函数会根据该函数执行完后的返回值判断是否含有该属性。
eg:

In [79]: class B:
    ...:     age = 1

In [82]: class A:
    ...:     def __getattr__(self,name):
    ...:         if name == '__members__':
    ...:             return dir(self._func1())
    ...:         return getattr(self._func2(),name)
    ...:     def _func1(self):
    ...:         print('from func1')
    ...:     def _func2(self):
    ...:         print('from func2')
    ...:         return B

In [83]: a = A()

In [84]: a.age
from func2
Out[84]: 1

setattr
语法:setattr(object,name,value)
它也是内置函数。用来给对象的属性或者方法赋值,若不存在,则先创建,再赋值。

In [27]: class A:
    ...:     some = 1
    ...:

In [28]:

In [28]: a = A()

In [29]: setattr(a,'age',18)

In [30]: getattr(a,'age')
Out[30]: 18





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值