由于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__是特点阻拦器,特点调用会传入处理,最后要有回来值,将传入特点处理后回来给调用者。

一致声明:关于原创博客内容,可能会有部分内容参阅自互联网,如有原创链接会声明引证;如找不到原创链接,在此声明如有侵权请联络删去哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联络删去哈。