Python中的反射机制

by:授客 QQ1033553122

概念

借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

module2.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
class TestClass:
    def __init__(self):
        pass
 
def fun(self):
    pass
 

module1.py

1、不导入模块

#!/usr/bin/env python

# -*- coding:utf-8 -*-

 

__author__ = 'shouke'

 

if __name__ == '__main__':

print(globals())

运行结果

运行结果:

{'__author__': 'shouke', '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01F5C310>, '__name__': '__main__', '__builtins__': , '__package__': None, '__doc__': None, '__cached__': None, '__file__': 'F:/project/interface_project/module1.py'}

说明:globals函数返回一个map,map中的key是全局范围内对象的名字,value是该对象的实例

2、导入模块

修改module1.py代码如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
import  sys
 
if __name__ == '__main__':
    print(globals())

运行结果:

{'__loader__': <_frozen_importlib.SourceFileLoader object at 0x01D9C310>, 'sys': , '__package__': None, '__builtins__': , '__author__': 'shouke', '__name__': '__main__', '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None}

如上,新增了带颜色部分的内容

3.导入类

修改module1.py代码如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
from module2 import TestClass
 
if __name__ == '__main__':
    print(globals())

输出结果:

{'TestClass': , '__package__': None, '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None, '__builtins__': , '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01DFC310>, '__author__': 'shouke', '__name__': '__main__'}

如上,新增了带颜色部分的内容

4、结合getattr,callable函数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
from module2 import TestClass
 
if __name__ == '__main__':
    # 动态获取类
    print('动态获取类:%s'% globals()['TestClass'])
print('\n')
 
    # 获取类的属性和函数
print(dir(TestClass))
print('\n')
 
    print(getattr(TestClass,'fun'))  # 获取类的函数对象
    print(getattr(globals()['TestClass'](),'attr')) # 获取类实例的属性对象print('\n')
 
    print(callable(getattr(TestClass,'fun')))    # 查看类的函数对象是否可调用
    print(callable(getattr(globals()['TestClass'](),'attr')))

运行结果:

动态获取类:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'fun']

value

True

False

说明:

dir([object])

不带参数,则返回当前作用域范围内的名称list。带参数则试图返回一个object的合法属性列表

callable(object)

返回True,如果对object为可调用,否则返回False。注意:类是可调用的(返回一个类实例),如果实例所属的类包含__call__()方法,那么实例也是可调用的

getattr(object, name[, default])

返回object对象名为name的属性的值

name必须为字符串。如果name为object对象的属性,那么返回属性的值,如getattr(x, 'foobar') 等同于x.foobar。如果name不存在,如果提供了default参数,则返回default。否则,抛出AttributeError

globals()

返回一个代表当前全局特征表的字典对象。总是显示当前模块的特征表字典(This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).

结论

通过以上globals,dir,callble,getattr等函数,可实现类似java的反射机制,可用于动态获取类,动态创建类对象,动态调用对象的方法等

Python Python中的反射机制的更多相关文章

  1. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  2. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  3. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  4. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  5. .Net 中的反射机制

    .Net 中的反射机制 概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标 ...

  6. oc中的反射机制

    好久没有总结过了,一直在赶项目... 今天来总结一下OC中的反射机制,有什么不对的地方,还请多多海涵. 反射机制,简单的说就是在程序运行期间通过类的名字来动态的获取类的信息,从而实现动态的创建类,以及 ...

  7. Javascript中的反射机制(五)

    一: 什么是反射机制 反射机制指的是程序在运行时能够获取自身的信息.例如一个对象能够在运行时知道自己有哪些方法和属性. 二: 在JavaScript中利用for(…in…)语句实现反射 在JavaSc ...

  8. C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)

    from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...

  9. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

随机推荐

  1. Java 虚拟机的内存结构

    Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的J ...

  2. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  3. Java诊断工具

    官方文档:Arthas(阿尔萨斯) 1. 安装成功后通过  arthas 命令使用 arthas软件 进入后显示服务器正在运行的Java进程: 2. help显示 atrhas 的功能列表

  4. Java的面向对象(初涉)

    Java的面向对象(初涉) 面向对象的分析根据抽象关键的问题域来分解系统.面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成"现实世界&qu ...

  5. Unicode 字符串排序规则(二):如何比较字符串

    一.UCA 简介 Unicode Collation Algorithm (UCA) 是 Unicode 规定的如何比较两个字符串大小的算法,也是事实上的标准.我们先来看下它的几个特征. 1.1 Mu ...

  6. Testing - 软件测试知识梳理 - 相关词汇

    测试策略 描述测试工程的总体方法和目标:根据测试需求,描述在什么测试阶,依据什么测试要素和目标,进行什么种类的测试,使用什么样的测试方法和工具. 测试策略的制定主要包含如下内容: 确定测试过程要使用的 ...

  7. Tools - VirtualBox的使用方法和技巧

    01 - 为CentOS虚拟机安装VirtualBox增强功能 启动CentOS虚拟机,点击"菜单 -> 设备 -> 安装增强功能". vboxadd的映像文件将会被挂 ...

  8. Python——pytessercat识别简单的验证码

    什么是验证码 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computersand Humans Apart” (全自动 ...

  9. Java Web——过滤器

    <Java Web开发技术应用——过滤器> 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进 ...

  10. .NetCore使用skywalking实现实时性能监控

    一.简介 很久之前写了一篇 <.Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控>关于NetCore性能监控的文章,使用Inf ...