zoukankan      html  css  js  c++  java
  • python 反射

      反射:让对象告诉我们他是什么,他有什么,并获取使用

    本文主要介绍 inspect 模块的使用:

    inspect模块: 用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等;

    Doc:这样写到

    The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects.

    这个模块是针对模块,类,方法,功能等对象提供些有用的方法。

    • getmembers(object[, predicate]): 

      这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), ...]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。

    以下例子中展示了如何获取模块中的类,如何获取类中的方法:

    import inspect
    import importlib
    
    # 导入模块
    module = importlib.import_module(moduleName)
    
    # 获取模块中的所有类
    classes = inspect.getmembers(module,inspect.isclass)
     # 遍历类并过滤
    for name, cls in classes:
        if issubclass(cls, TestCase):
            # 获取类中的方法
            methods = inspect.getmembers(cls,inspect.ismethod)
            for name, method in methods:
                if method.__name__.startswith("test"):
                    dict = {
                        'psoName': psoName,
                        'className': module.__name__+"."+cls.__name__,
                        'methodName': method.__name__,
                        'description': method.__doc__
                     }
                     dict['name'] = dict['psoName']+"."+dict['className']+"."+dict['methodName']    

    inspect模块的实现本质是依赖于dir与getattr:

    def getmembers(object, predicate=None):
        """Return all members of an object as (name, value) pairs sorted by name.
        Optionally, only return members that satisfy a given predicate."""
        results = []
        for key in dir(object):
            try:
                value = getattr(object, key)
            except AttributeError:
                continue
            if not predicate or predicate(value):
           # 元组列表  results.append((key, value)) results.sort()
    return results

     反射详细参考:https://www.cnblogs.com/huxi/archive/2011/01/02/1924317.html

  • 相关阅读:
    iPhone开发之深入浅出 (3) — ARC之前世今生
    iPhone开发之深入浅出 (2) — ARC之@property使用
    iPhone开发之深入浅出 (7) — ARC总结
    理解ARC在ObjectiveC中的应用
    c# ref与out的区别
    c# 变量交换
    javascript AJAX简单原理及什么是ajax
    通用的进程监控重拉起bash脚本
    MOOONagent更新:新增IHeartbeatHook接口
    MOOON分布式消息结构
  • 原文地址:https://www.cnblogs.com/yelao/p/11002845.html
Copyright © 2011-2022 走看看