python中有很多内建属性常见的有:
__init__ __str__ __new__ __del__ __repr__ __getatrribute__等等
这次来说一下__getatrribute__
属性拦截器
> 先来一段代码:
> 运行结果:
分析:
19行的代码正常输出了属性subject2的值'属性拦截器不运行正常返回'
但是18行的代码却没有输出属性subject1的值
。
这是为什么呢?原因就是我们在第7行定义了内建属性__getatrribute__属性拦截器。
什么是属性拦截器?
和它的名字一样只要一个类中有这个__getatrribute__,那么在访问这个类中的属性**(有或者没有!)
**时都会触发它的运行
,之后再根据__getatrribute__设置的方式获得属性内容。Python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。所以我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等。
比如这里我就设置了if语句如果访问的属性名字是subject2就是正常返回return object.__getattribute__(self,item)
属性subject2的值不做任何修改或者添加或者其他操作。
如果访问subject1属性的值,在这我让他输出属性拦截器运行
并返回无权限访问subject1
**
然后引用别人博客的一个经常会犯的错误(当然我也错过):
**
class Tree(object):
def __init__(self,name):
self.name = name
self.cate = "plant"
def __getattribute__(self,item):
if item.endswith("e"):
return item.__getattribute__(self,item)
else:
return self.call_wind
def call_wind(self):
return "树大招风"
aa = Tree("大树")
print(aa.name)#因为name是以e结尾,所以返回的还是name,所以打印出"大树"
aa.wind()#这个代码中因为wind不是以e结尾,所以返回self.call_wind的结果,打印的是"树大招风"