__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