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中的io系统详解

    相关读书笔记.心得文章列表 Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字 ...

  2. Eclipse 中 Debug 时鼠标悬停无法查看变量值

    问题描述:Eclipse在Debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值. 解决方法:在Eclipse中点击 Window->Preferences->Java-&g ...

  3. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  4. GMM基础

    一.单成分单变量高斯模型 二.单成分多变量高斯模型 若协方差矩阵为对角矩阵且对角线上值相等,两变量高斯分布的等值线为圆形. 若协方差矩阵为对角矩阵且对角线上值不等,两变量高斯分布的等值线为椭圆形, 长 ...

  5. VS发布 错误 未能将文件 复制到

    在VS内部编译及试运行的时候并为出现错误一切正常 当将项目发布时提示XXX文件无法复制到对应的obj文件夹下 未能将文件 upfile\team\2013\0328\20130328112637296 ...

  6. web自动化测试---概述

    最早的时候是做功能测试,web都是自己手工点击看看有没问题,没有系统的进行测试,更别说自动化测试了,那是一段不堪回首的往事,就是因为这,很多问题都流出去了,这是作为测试人员的一大失职,痛定思痛,开始学 ...

  7. 手把手教您定制化Centos6.x安装界面

    1.获取安装界面代码      挂载image/install.img:mount image/install.img /mnt/5 -o loop      复制挂载后的代码至self_intall ...

  8. C++模板的应用

    需求:类比数组类,只不过数组类型不再是整型.浮点型等,也可以是类. 1.创建模板类 头文件 #ifndef MYVECTOR_H #define MYVECTOR_H #include <ios ...

  9. (转)关于CNN中平移不变性的理解

    https://www.quora.com/Why-and-how-are-convolutional-neural-networks-translation-invariant https://st ...

  10. 动手实现react Modal组件

    Modal组件 长话不多说,接下来让我们来动手实现一个react Modal组件. 我们先来看一下实际效果 Modal的布局 首先,让我们先思考下一个Modal组件的布局是怎么样的. 我们先拿一个基本 ...