• Python 反射


    Python 反射

    以字符串的形式去操作某个对象中的成员(Python中一切皆对象)

    • 概述

      getattr(),setattr(),delattr()为 Python 的内置方法。

    1.getattr

    用来获取对象的属性或者方法,(注:获取到方法,但是并未执行)。

    1.1 包文件使用

    # 普通使用
    import test
    # test.func1()  func1 函数执行了
    # test.func2()  func2 函数执行了
    
    # 在 Python 一切皆对象
    f1=getattr(test,'func1')
    f1()
    f2=getattr(test,'func2')
    f2()
    
    # 通过反射获取函数对象,加上()就会执行。
    

    image-20220120211512356

    1.2 类反射使用

    class Foo:
        def __init__(self):
            self.name="啊哈"
            self.age="啊哈哈"
    obj=Foo()
    # 使用反射
    name=getattr(obj,'name')
    print(name)
    age=getattr(obj,'age')
    print(age)
    

    类对象反射:通过反射获取自己已经实例化好的对象,并获取对应的属性。

    image-20220120212138508

    2.setattr

    setattr(obj,'name','好的')
    print(obj.name)
    # 添加
    setattr(obj,'postion','北京')
    print(obj.postion)
    

    通过本方法为对象添加或者修改属性值。

    image-20220120213720738

    3.delattr

    delattr(obj,'name')
    print(obj.name)
    

    image-20220120214109930

    4.应用场景

    补充:通过字符串导入对应的路径与模块。

    import importlib
    # 将路径传入对应参数,并返回导入函数。
    m=importlib.import_module("communs.path.UserInfo")
    

    4.1 加载对应的函数

    加载业务类,类似于Django的中间件。

    import settings
    import importlib
    importlib.import_module("communs.db.utils")
    for item in settings.FUNC_LIST:
        path,func_name=item.rsplit('.',maxsplit=1)
        # print(path,func_name)
        m=importlib.import_module(path)
        func=getattr(m,func_name)
        func()
    
    FUNC_LIST=[
        'communs.db.utils.f1',
        'communs.db.utils.f2',
        'communs.db.utils.f3',
        'communs.db.utils.f4',
    ]
    
    settings.py
    

    image-20220120220817358

    4.2 加载对应的类

    for item in settings.CLASS_NAME:
        path_str,cls_name=item.rsplit('.',maxsplit=1)
        m=importlib.import_module(path_str)
        cls=getattr(m,'AuthPerson')
        cls("准备休息吧")#实例化对象。
        # 如果实例化的类中存在参数的话,如果是循环创建多个对象的话,参数尽量保持相同
    

    image-20220120221957854

    说明:以上两种方式都具有非常好的扩展性。比较接近开放封闭原则

    5.列表的补充

    image-20220120223118914

    li=[1,1,9,3,4,5,6]
    print(li[2])
    # 本质上是在执行__getitem__方法。
    print(li.__getitem__(2))
    # 通过反射获取列表中的元素
    method=getattr(li,'__getitem__')
    res=method(3)
    print(res)
    

    image-20220120223143242

    继续努力,终成大器!

  • 相关阅读:
    poj 2773 利用欧拉函数求互质数
    poj3358:欧拉定理
    poj:2992 因子数量
    poj3696:同余方程,欧拉定理
    USACO5.4-Character Recognition
    hdu5017:补题系列之西安网络赛1011
    hdu5014:number sequence对称思想
    欧拉函数,欧拉定理例题整理
    POJ 3463 Sightseeing (次短路)
    POJ
  • 原文地址:https://www.cnblogs.com/Blogwj123/p/15828380.html
Copyright © 2020-2023  润新知