zoukankan      html  css  js  c++  java
  • hasattr、getattr、setattr反射

    首先需要知道他们都是由对象obj来调用的:hasattr[实例,字符串]
    先看下这三个方法的作用:
    hasattr:
     1 class Name():
     2     x = 'this is x'
     3 
     4     def f_a(self,attr):
     5         print(hasattr(self,attr))
     6 
     7 if __name__ == '__main__':
     8     n = Name()
     9     n.f_a('x')
    10     n.f_a('y')
    11     n.f_a('f_a')

    运行结果:

    1 C:UserslwjAppDataLocalProgramsPythonPython37python.exe D:/02Project/pacho/08day/反射/st_反射.py
    2 True
    3 False
    4 True
    5 
    6 Process finished with exit code 0

    从上面的例子可以看出,hasattr作用是判断实例是否有对应的属性(数据属性和方法属性),如果有返回True,没有则返回False

    getattr:

     1 class Name():
     2     x = 'this is x'
     3 
     4     def f_a(self,attr):
     5         f = getattr(self,attr)
     6         print(type(f))
     7         print(f)
     8 
     9 if __name__ == '__main__':
    10     n = Name()
    11     n.f_a('x')
    12     n.f_a('f_a')
    13     n.f_a('y')

    执行结果:

     1 C:UserslwjAppDataLocalProgramsPythonPython37python.exe D:/02Project/pacho/08day/反射/st_反射.py
     2 <class 'str'>
     3 this is x
     4 <class 'method'>
     5 <bound method Name.f_a of <__main__.Name object at 0x00000000020C28C8>>
     6 Traceback (most recent call last):
     7   File "D:/02Project/pacho/08day/反射/st_反射.py", line 49, in <module>
     8     n.f_a('y')
     9   File "D:/02Project/pacho/08day/反射/st_反射.py", line 41, in f_a
    10     f = getattr(self,attr)
    11 AttributeError: 'Name' object has no attribute 'y'
    12 
    13 Process finished with exit code 1

    从上面的例子可以看出,getattr是根据传入的字符串来判断是否有对应属性,如果有对应属性,则返回该属性的值(内存地址);如果没有对应属性,则抛异常AttributeError

    setattr:

     1 class Name():
     2     x = 'this is x'
     3     value = 10
     4 
     5     def f_a(self,attr):
     6         setattr(self,attr,self.value)
     7 
     8 
     9 if __name__ == '__main__':
    10     n = Name()
    11     print(n.x)
    12     n.f_a('x')
    13     print(n.x)

    执行结果:

    1 C:UserslwjAppDataLocalProgramsPythonPython37python.exe D:/02Project/pacho/08day/反射/st_反射.py
    2 this is x
    3 10
    4 
    5 Process finished with exit code 0

    从上面的例子可以看出,setattr是吧实例的属性重新赋值,我们可以赋值为数据属性或者方法,上面是举例数据属性,下面举例设置方法:

     1 class Name():
     2     x = 'this is x'
     3     def value(self):
     4         print('I am value')
     5 
     6     def f_a(self,attr):
     7         setattr(self,attr,self.value)  # 这里只传方法名,而不是self.value()   这样会把方法的返回值赋值给属性
     8 
     9 
    10 if __name__ == '__main__':
    11     n = Name()
    12     print(n.x)
    13     n.f_a('x')
    14     print(n.x)
    15     n.x()

    执行结果:

    1 C:UserslwjAppDataLocalProgramsPythonPython37python.exe D:/02Project/pacho/08day/反射/st_反射.py
    2 this is x
    3 <bound method Name.value of <__main__.Name object at 0x0000000002584988>>
    4 I am value
    5 
    6 Process finished with exit code 0

    总结:

    hasattr

    使用:hasattr(obj,'属性')

    作用:判断实例obj是否具有某属性,有则返回True,无则返回False

    getattr

    使用:getattr(obj,'属性')

    作用:获取obj的属性(一般赋值给变量)

    setattr

    使用:setattr(obj,'属性',属性值)

    作用:给obj的属性赋值(值可以是数据属性,也可以是具体的方法,或者方法的返回值)

    补充:反射使用举例https://www.cnblogs.com/wjlv/p/11650620.html

  • 相关阅读:
    linux——03-DevOps实战(详版)
    总结跟语言无关的东西
    drf—— RBAC-基于角色的访问控制
    drf—— 全局异常
    122买卖股票的最佳时机
    还记得这门古老的编程语言么,送你一份perl书单!
    程序员学习必备书单汇总,超全!
    书单来了!大厂的技术牛人在读什么:阿里篇
    书单来了!大厂的技术牛人在读什么:华为篇
    书单来了!大厂的技术牛人在读什么:腾讯篇
  • 原文地址:https://www.cnblogs.com/wjlv/p/11649667.html
Copyright © 2011-2022 走看看