Python内建属性getattribute拦截器使用详解
本文详解Python中__getattribute__内建属性的工作原理。作为所有类的默认继承基类object提供的拦截器,它允许开发者在属性访问时进行自定义处理。通过重写该方法,可实现权限校验、日志记录等功能,但需注意必须正确调用父类方法并返回结果,否则会导致属性访问失败。
引言
在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,Python 会将 name 作为参数传递给 __getattribute__ 方法。经过一系列处理后,该方法返回处理后的结果。
在Python中,只要定义了继承自object的类,就默认存在属性拦截器。默认情况下,拦截后不进行任何额外操作,直接返回原值。因此,我们可以重写 __getattribute__ 方法来实现特定功能,例如权限检查或打印日志。
2.如果重写了__getattribute__,则类会调用重写后的方法。因此,该方法必须包含return语句,返回传入的属性值,否则调用属性时将导致失败。
3.注意,如果直接使用类名访问类属性(如 Class.attr),则不会调用 __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, **kwargs) 中,传入的参数是属性名,而非属性值。这是一个常见的初学者误区。
2.使用类名调用类属性时,不会经过 __getattribute__ 方法。只有实例对象对属性的调用(包括访问类属性)才会触发该方法。
3.__getattribute__ 是属性拦截器,属性调用会传入该方法进行处理,最后必须有返回值,将处理后的属性返回给调用者。
以上就是Python内建属性getattribute拦截器使用详解的详细内容,更多关于Python内建属性getattribute拦截器的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













