zoukankan      html  css  js  c++  java
  • 反射和自省

    一、反射使用

    python是面向对象语言,其中反射的含义为:通过字符串的形式操作对相关的属性。
    python内置四个自省的方法:
    1、hasattr(object,name)
    2、getattr(object,name,default=None)
    3、setattr(object,key,value)
    4、delattr(object,item)
    注意:这里的key、name、item 都是字符串

    定义一个Shool类:

    class Shool:
        def __init__(self,name,addr):
            self.name =name
            self.addr =addr
    
        def room(self):
            print("这里有很多300间教室")
    
    

    hasattr举例

    s1 = Shool("中学","天通苑")#实例化
    print(hasattr(s1,"room"))#判断s1是否有room属性
    print(hasattr(s1,"name"))#判断s1是否有name属性
    print(hasattr(s1,"addr"))#判断s1是否有addr属性
    print(hasattr(s1,"addrname"))#判断s1是否有addrname属性
    

    执行结果

    True
    True
    True
    False
    

    getattr举例

    res1 = getattr(s1,"name")
    res2 = getattr(s1,"addr")
    res3 = getattr(s1,"room")
    res4 = getattr(s1,"addroom", "没有这个属性")
    print(res1)
    print(res2)
    print(res3)
    print(res4)
    
    

    执行结果

    中学
    天通苑
    <bound method Shool.room of <__main__.Shool object at 0x105d710f0>>
    没有这个属性
    

    setattr举例

    print(s1.name)
    setattr(s1,"name","大学") # 修改了s1.name
    print(s1.name)
    setattr(s1,"square",23000) #没有square,就新建一个square属性
    print(s1.square)
    

    执行结果

    中学
    大学
    23000
    

    delattr举例

    res1 = getattr(s1,"square")
    delattr(s1,"square")
    res2 = getattr(s1,"square","这个属性没有了")
    print(res1)
    print(res2)
    
    

    执行结果

    23000
    这个属性没有了
    

    对象可以使用这四个方法外,也可以使用这些方法。同上

    补充:模块也可以通过反射,查看是否存在某个方法。

    import sys
    this_module = sys.modules[__name__] # 获取当前的模块名
    

    二、作用和好处

    1、实现可插拔机制:相互依赖的两个py执行文件,可以通过这个方式协同工作
    2、动态导入模块:

    import importlib
    importlib.import_module("import_lib.metaclass")
    
    
  • 相关阅读:
    谷粒商城Day1
    解决GitHub访问慢的问题
    Java基础知识面试题
    Spring框架学习
    MATLAB基础学习(3)——数值数组及运算
    MATLAB基础学习(2)
    MATLAB基础学习篇(1)
    页面加载之前显示正在加载
    CSS设置多余的文本显示省略号
    Node.js(六)- HTTP知识先填坑
  • 原文地址:https://www.cnblogs.com/greatkyle/p/6758318.html
Copyright © 2011-2022 走看看