• 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 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    设计模式(一)工厂模式Factory(创建型)
    Caused by: org.springframework.beans.factory.BeanCreationException
    从Delphi 7升级到Delphi XE
    system strategies of Resources Deadlock
    Service Manager流程,派BC_REPLY,唤醒FregServer流程,返回BR_TRANSACTION_COMPLETE,睡眠等待proc-&gt;wait
    Sqlserver2000联系Oracle11G数据库进行实时数据的同步
    火柴移动面试题
    Eclipse4.4设备egit插件提交本地项目代码到远程仓库
    V离MWare至Openstack至FDIO
    【BZOJ1791】【IOI2008】【基环树】island(status第一速度)
  • 原文地址:https://www.cnblogs.com/RainBol/p/10084142.html
Copyright © 2020-2023  润新知