由于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__是特点阻拦器,特点调用会传入处理,最后要有回来值,将传入特点处理后回来给调用者。
一致声明:关于原创博客内容,可能会有部分内容参阅自互联网,如有原创链接会声明引证;如找不到原创链接,在此声明如有侵权请联络删去哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联络删去哈。