• attr方法笔记(反射)


    attr方法笔记

      attr中用到了四个内置面向对象方法(__getattr__,__setattr__,__hasattr__,__delattr__),这称为反射,由于python中一切皆对象,反射可以任意的根据字符串形式取对象中获取/修改/删除成员

      对象的属性可能来自于其类定义,叫做类属性(class attribute)。

      类属性可能来自类定义自身,也可能根据类定义继承来的。

      一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)

    class test() :
        username = 'username值'
        def hhh(self):
            return '运行我'
        def a(self):
            return 1
    p = test()
    hasattr(object, name)
    #hasattr(object, name)
    print(hasattr(p,'username'))#判断一个对象中是否有其参数一样的类属性或者类方法,返回布尔值,hasattr方法在项目中使用较少因为直接可以用getattr(p,None)来代替
    print(hasattr(p,'hhh'))
    getattr(object, name[,default])
    print(getattr(p,'username'))#获取一个对象中方法或者属性,参数为函数名或者变量名,使用getattr需要保证的是函数或者变量存在,不然会报错
    print(getattr(p,'username'))
    
    print(getattr(p,'hhh'))#打印<bound method test.hhh of <__main__.test object at 0x0000000002564080>>
    #getattr(p,'2222')   #AttributeError: 'test' object has no attribute '2222'
    getattr(p,'hhh')()#再加括号表示运行
    print(getattr(p,'password',p.hhh()))#为了避免报错,如果找不到函数或者变量可以在后面再加上一个参数值,若不存在则返回默认变量
    print(getattr(p,'password',p.hhh(),None))#None表示为空,不做处理
    setattr(object, name, values)
    #给对象的属性赋值,若属性不存在,先创建再赋值。
    print(hasattr(p,'password'))#返回的一定是false
    print(setattr(p,'password',test.username))#给password赋予username同样的属性
    print(p.username)
    print(p.password)#虽然pycharm报错了但是我们仍然可以运行,也就是说我们也可以通过这种办法给函数或者变量赋值
    
    print(hasattr(p,'hhh'))
    print(getattr(p,'cc',setattr(p,'cc',p.a())))
    print(getattr(p,'cc'))#这样就生成了一个cc函数并且和a一样方法

    setattr应用

    #这样可以理解成a方法,hhh方法,调用一个a时,如果没有调用成功,把hhh方法变成a方法,继续运行a方法而不用大批量修改方法名
    if getattr(p, "c", None) is None:
        setattr(p, "c", p.hhh())
    a = getattr(p, "c")

    delattr(object,name)

    #函数作用用来删除指定对象的指定名称的属性,和setattr函数作用相反
    #删除属性
    
    class Test:
        def __init__(self,name):
            self.name = name
        aaa = 'aaa'
        def bbb(self):
            print(self.name)
    delattr(test,'aaa')
    print("删除aaa成功应该返回False:",hasattr(test,'aaa'))#删除成功返回false
    #delattr(test,'name')没有实例化之前不能删除构造函数中的变量,直接报错
    c = test(1)#实例化,下面是实例化之后的测试 #delattr(c,'ssd')#删除不存在的变量也会报错 delattr(c,'name')#用对象来删除变量 print("实例化之后可以直接删除构造函数中的变量",hasattr(c,'name'))#删除成功,返回False #在引用name报错说明删除成功 #print(c.name)# AttributeError: 'test' object has no attribute 'name'

    #不能删除方法
    #delattr(c,'bbb')#AttributeError: bbb,但是不能删除对象的方法

    内建sttr方法

    # __setattr__:
    # 当设置对象的属性时会触发,比如self.name = name,有几次赋值会触发几次运行,或者setattr()被调用时也会触发__setattr__。
    #
    # __delattr__:
    # 当删除对象属性时会触发,比如del p.name或者调用delattr()时也会触发__delattr__。
    #
    # __getattr__:
    # 此内置方法比较特殊,当对象的属性不存在时会触发执行__getattr__。

     __getattribute__  属性访问拦截器  

      常用于权限,日志

      参考:

    https://www.cnblogs.com/blackmatrix/p/5681480.html

    https://blog.csdn.net/yitiaodashu/article/details/78974596

    版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    微人事项目-mybatis-持久层
    通过外键连接多个表
    springioc
    Redis 消息中间件 ServiceStack.Redis 轻量级
    深度数据对接 链接服务器 数据传输
    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
    sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
    sql server 远程备份 bak 删除
    冒泡排序
    多线程 异步 beginInvoke EndInvoke 使用
  • 原文地址:https://www.cnblogs.com/RainBol/p/10084142.html
Copyright © 2020-2023  润新知