Python Python中的反射机制
Python中的反射机制
by:授客 QQ:1033553122
概念
借用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中的反射机制的更多相关文章
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- .Net 中的反射机制
.Net 中的反射机制 概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能. 运行时类型标识 运行时类型标 ...
- oc中的反射机制
好久没有总结过了,一直在赶项目... 今天来总结一下OC中的反射机制,有什么不对的地方,还请多多海涵. 反射机制,简单的说就是在程序运行期间通过类的名字来动态的获取类的信息,从而实现动态的创建类,以及 ...
- Javascript中的反射机制(五)
一: 什么是反射机制 反射机制指的是程序在运行时能够获取自身的信息.例如一个对象能够在运行时知道自己有哪些方法和属性. 二: 在JavaScript中利用for(…in…)语句实现反射 在JavaSc ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
随机推荐
- 转---JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制
作者:德来 segmentfault.com/a/1190000004292479 如有好文章投稿,请点击 → 这里了解详情 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如: ...
- 理解Docker
Docker Image OS分为 内核(kernel) 和 用户 空间,kernel 启动后,会挂载root文件系统提供用户空间. Docker Image 就相当于一个 root文件系统.是一个特 ...
- Tools - UML
ProcessOn - 在线绘图工具 ProcessOn 支持流程图.思维导图.原型图.UML.网络拓扑图等: 主流的UML图列都支持,可以作为方便快捷的UML工具: PlantUML - 多系统多编 ...
- mysql之UPDATE,SELECT,INSERT语法
一 :UPDATE语法 UPDATE 是一个修改表中行的DML语句. #单表语法(常用) UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET as ...
- getResourceAsStream的3种路径配置
getResourceAsStream有以下几种: 1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’ ...
- Ubantu常用命令
Ubantu常用命令 ctrl alt t :打开终端 ctrl d : 关闭终端 F11 : 终端全屏,再按一次退出全屏 Super(即win) ...
- EF code first,set composite primary key 复合key问题
环境: EF core 2.0 Net core 2.0 错误: 因实体定义了多个key,打开数据库时程序报以下错误 An unhandled exception occurred while pro ...
- 设置c++中cout输出的字体颜色
在c++中控制台的默认字体颜色是白色,但是有时我们需要其他颜色,比如用红色提示错误,使用绿色提示计算完成,使用黄色表示警示等等,那么如何设置控制台文字的颜色呢? 一种方法是通过右键控制台进行颜色设置, ...
- PCA降维实验代码
实验需要提取数据的空间信息,所以要对光谱进行降维,使用主成分分析算法,样例代码备份如下 # -*- coding: utf-8 -*- """ Created on Mo ...
- 从零开始学 Web 之 JavaScript(三)函数
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...