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. typescript handbook 学习笔记1

    概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...

  2. code128 C语言实现

    https://blog.csdn.net/walk_ing/article/details/52712641 参考链接 1,具有A.B.C三种不同的编码类型,可提供标准ASCII中128个字元(字元 ...

  3. [HAOI2017] 新型城市化

    给出的图中恰包含2个团,则图的补图为一个二分图,其最大独立集为原图的最大团. 我们知道,二分图的最大独立集=V-最小顶点覆盖,最小顶点覆盖=最大匹配. 问题转化为:计算删去后最大匹配减小的边集. 所以 ...

  4. Android 系统服务

    模拟器版本 Android 4.1.2 - API Level 16 CMD 下输入:adb shell service list   服务名 对象 0 phone com.android.inter ...

  5. leetcode — remove-nth-node-from-end-of-list

    /** * Source : https://oj.leetcode.com/problems/remove-nth-node-from-end-of-list/ * * Created by lve ...

  6. mysql 循环

    DELIMITER $$ DROP PROCEDURE IF EXISTS student_insert_while; $$ ), in birthday date, in age int) begi ...

  7. mac使用brew安装mysql

    1.安装mysql #brew install mysql 报错 Error: The following directories are not writable by your user: /us ...

  8. Linux 服务器命令,持续更新……

    记录一下常用命令给自己备忘备查,会持续更新-- 一.查看和修改Linux的时间 1. 查看时间和日期,命令: date 2.设定时间和日期 例如:将系统日期修改成2020年2月14日12点的命令: d ...

  9. SpringBoot入门之基于注解的Mybatis

    今天学习下SpringBoot集成mybatis,集成mybatis一般有两种方式,一个是基于注解的一个是基于xml配置的.今天先了解下基于注解的mybatis集成. 一.引入依赖项 因为是mybat ...

  10. loadrunner:Action.c(4): Error -27796: Failed to connect to server "192.168.66.3:8080": [10060] Connection timed out

    Action.c(4): Error -27796: Failed to connect to server "192.168.66.3:8080": [10060] Connec ...