zoukankan      html  css  js  c++  java
  • python笔记59-类里面的__getattribute__属性拦截器

    前言

    写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的__getattribute__属性拦截器。
    python的类默认都继承了object类,object提供了了很多原始的内建属性和方法。

    __getattribute__属性作用

    __getattribute__属性作用是类实例化调用属性和方法的时候都会调用一次,在object类里面默认是返回该方法的值,没做任何处理

    class object:
        """ The most base type """
    
    
        def __getattribute__(self, *args, **kwargs): # real signature unknown
            """ Return getattr(self, name). """
            pass
    

    __getattribute__方法默认返回getattr(self, name)

    getattr()函数

    getattr() 函数用于返回一个对象属性值。

    getattr(object, name[, default]):

    • object -- 对象。
    • name -- 字符串,对象属性。
    • default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
    # 作者-上海悠悠 QQ交流群:717225969 
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    class A(object):
    
        count = 0
    
        def __init__(self):
            self.name = "yoyo"
            self.age = 18
    
        def start(self):
            print("start1111111")
    
    a = A()
    # 获取属性, 实例方法也是类的属性
    print(getattr(a, "count"))
    print(getattr(a, "name"))
    print(getattr(a, "start"))
    

    运行结果

    0
    yoyo
    <bound method A.start of <__main__.A object at 0x000001EE977FA940>>
    

    __getattribute__属性拦截器

    A类实例化对象a,每调用一次属性和方法都会调用一下拦截器,这样方便我们在日志输出的时候,捕获到调用哪些方法,也可以在权限验证的时候,在这里判断有没权限调用对应的方法。
    可以通过重写object类的__getattribute__方法实现属性拦截功能。

    # 作者-上海悠悠 QQ交流群:717225969 
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    class A(object):
    
        count = 0
    
        def __init__(self):
            self.name = "yoyo"
            self.age = 18
    
        def start(self):
            print("start1111111")
    
        def __getattribute__(self, item):
            """属性拦截器"""
            print("调用了A类的属性:", item)
            return object.__getattribute__(self, item)
    
    a = A()
    # A()实例对象属性会调用__getattribute__
    print(a.count)
    print(a.age)
    print(a.name)
    print(a.start())
    

    A类在调用自身属性的时候,是不会触发__getattribute__方法

    # 类的属性不调用__getattribute__
    print(A.count)
    

    需注意的是在定义__getattribute__方法的时候,只能返回object.__getattribute__(self, item)
    不能返回getattr(self, item),这样会进入无限循环,一直反复调用self实例的item属性,导致一直触发这个方法.

  • 相关阅读:
    超级好用的装机神器——Ventoy
    CentOS7.4安装Nvidia Tesla T4驱动
    ESXI常用命令
    阿里云|腾讯云MySQL备份文件一键恢复工具
    在甲方做三年安全的碎碎念
    golang操作docker
    Nginx Module扩展模块实现
    炒冷饭之ThinkPHP3.2.X RCE漏洞分析
    Windows:sysprep.exe工具:审核模式 VS OOBE模式(工厂模式 VS 用户模式)
    高校毕业生人数增长图
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/15154599.html
Copyright © 2011-2022 走看看