您现在的位置是:网站首页> 编程资料编程资料
Python内建属性getattribute拦截器使用详解_python_
2023-05-26
369人已围观
简介 Python内建属性getattribute拦截器使用详解_python_
引言
因为python中所有类默认继承object类。
而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。
可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际开发中用户都需要重写后才会使用。
对于python来说,属性或者函数都可以被理解成一个属性
1.内建属性__getattribute__的用法
1.重写__getattribute__方法 class Student(object): country = "china" #类属性不会放到__dict__中 def __init__(self,name,age): self.name = name self.age = age def __getattribute__(self, attr): #注意:attr是传入的属性名,不是属性值 print("开始属性校验拦截功能") print(attr) return object.__getattribute__(self, attr) #返回属性名 s1 = Student("tom",19) print(Student.country,s1.country,s1.name,s1.age) #调用属性,会调用__getattribute__方法 '''注意结果,调用了四次属性,但是却只调用了3次 __getattribute__方法。 开始属性校验拦截功能 country 开始属性校验拦截功能 name 开始属性校验拦截功能 age china china tom 19 '''分析总结:
1.__getattribute__ 是属性访问拦截器,就是当这个类的属性被实例访问时,会自动调用类的__getattribute__方法。
当实例调用属性时,比如s1.name,会把name作为实参传进__getattribute__方法中,经过一系列操作后,再把name处理后的结果返回。
Python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。所以我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等。
2.如果重写了__getattribute__,则类会调用重写的方法,所以这个方法必须要有renturn返回值,返回传进去的属性,否则调用属性会出现失败的情况。
3.注意如果是直接用类名.类属性的形式调用类属性,是不会调用 __getattribute__方法。
2.重写__getattribute__实现属性拦截功能
class Student(object): country = "china" #类属性不会放到__dict__中 def __init__(self,name,age): self.name = name self.age = age def __getattribute__(self, attr): #注意:attr是传入的属性名,不是属性值 print("开始属性校验拦截功能") print(attr) if attr == "name": #注意这里引用原属性名不用self,直接引号引起来即可。 print("现在开始调用的是name属性") elif attr =="age": print("现在开始调用的是age属性") else: print("现在调用的是其他属性") return object.__getattribute__(self, attr) #返回属性名 s1 = Student("tom",19) print(s1.name,s1.age,s1.country) '''结果如下: 开始属性校验拦截功能 name 现在开始调用的是name属性 开始属性校验拦截功能 age 现在开始调用的是age属性 开始属性校验拦截功能 country 现在调用的是其他属性 tom 19 china ''' 总结要点:
1.__getattribute__(self,*args,**kwgs)中传入的参数是属性名,不是属值,很多初学者有误区。
2.使用类名调用类属性时,不会经过__getattribute__方法,只争取实例对象对属性的调用,包括调用类属性
3.__getattribute__是属性拦截器,属性调用会传入处理,最后要有返回值,将传入属性处理后返回给调用者。
以上就是Python内建属性getattribute拦截器使用详解的详细内容,更多关于Python内建属性getattribute拦截器的资料请关注其它相关文章!
相关内容
- Python爬虫获取国外大桥排行榜数据清单_python_
- pandas实现按照多列排序-ascending_python_
- python beautifulsoup4 模块详情_python_
- pandas的排序、分组groupby及cumsum累计求和方式_python_
- pandas如何计算同比环比增长_python_
- Python利用xlrd 与 xlwt 模块操作 Excel_python_
- Python标准库uuid模块(生成唯一标识)详解_python_
- Pandas常用累计、同比、环比等统计方法实践过程_python_
- python如何实现API的调用详解_python_
- python中的多cpu并行编程_python_
