什么是反射?

1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。
2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢

反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法

python中访问类或对象的成员有三种方法

##如下所示 obj 为对象 var为变量 func为函数
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')


反射有4个方法 getattr() hasattr() setattr() delattr()


举例子如下,一目了然

class A(object):
    gvar = 'min'
    def __init__(self,name,male):
        self.name = name
        self.male = male
    def func1(self):
        print "func1 :my name is %s" % self.name
    def func2(self):
        print "func2 :I'm a %s" % self.male

##实例化对象
obj = A('min','girl')
hasattr(obj,'gvar')
hasattr(obj,'func1')
getattr(obj,'gvar')
getattr(obj,'name')
getattr(obj,'func1')
getattr(obj,'func2')()
setattr(obj,'gvar','ben')
getattr(obj,'gvar')
delattr(obj,'gvar')
##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
getattr(A,'func2')
hasattr(A,'func1')

#当某个字符串就是模块名时,我们导入模块时可以用以下方法导入
mymodule = __import__(var) #这个就相当于导入模块var.py了

导入后,你可以在你的代码中用mymodule.*来调用该模块下的任意方法

>>> class A(object):
...     gvar = 'min'
...     def __init__(self,name,male):
...         self.name = name
...         self.male = male
...     def func1(self):
...         print "func1 :my name is %s" % self.name
...     def func2(self):
...         print "func2 :I'm a %s" % self.male
...
>>> ##实例化对象
... obj = A('min','girl')
>>> hasattr(obj,'gvar')
True
>>> hasattr(obj,'func1')
True
>>> getattr(obj,'gvar')
'min'
>>> getattr(obj,'name')
'min'
>>> getattr(obj,'func1')
<bound method A.func1 of <__main__.A object at 0x7f7b89f99a50>>
>>> getattr(obj,'func2')()
func2 :I'm a girl
>>> setattr(obj,'gvar','ben')
>>> getattr(obj,'gvar')
'ben'
>>> delattr(obj,'gvar')
>>> ##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
... getattr(A,'func2')
<unbound method A.func2>
>>> hasattr(A,'func1')
True

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

  1. python的反射机制

    转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...

  2. 简单谈谈python的反射机制

    转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...

  3. 【转】简单谈谈python的反射机制

    [转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...

  4. 详解python之反射机制

    一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...

  5. python之反射机制与callattr()、issubclass()、isinstance、type()相关

    一.反射机制 * 反射可以理解为 通过字符串的形式,动态导入模块: 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动! 反射机制的内置函数 # hasa ...

  6. Python 的反射机制

    什么叫做反射 利用字符串的形式去对象(模块)中操作(查找/添加/获取/删除)成员,一种基于字符串的事件驱动. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以 ...

  7. python面向对象--反射机制

    class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def ...

  8. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  9. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

随机推荐

  1. 使用java程序作为celery的工作节点

    celery是python实现的分布式调度框架,有时候想用celery去调用java服务,正好有一个celery-java的库可以使用,能达到这个效果,记录一下: 先添加依赖: <depende ...

  2. hbase shell命令及Java接口介绍

    一. shell命令 1. 进入hbase命令行  ./hbase shell 2. 显示hbase中的表  list3. 创建user表,包含info.data两个列族create 'user', ...

  3. JVM垃圾回收?看这一篇就够了!

    深入理解JVM垃圾回收机制 1.垃圾回收需要解决的问题及解决的办法总览 1.如何判定对象为垃圾对象 引用计数法 可达性分析法 2.如何回收 回收策略 标记-清除算法 复制算法 标记-整理算法 分带收集 ...

  4. vue-cli+webpack打包,上线

    1.先修改配置文件再打包.有些人打包后运行一片空白,主要是由于路径问题 所以首先需要修改config下的index.js配置文件 上图中第一个要修改的就是静态文件的路径,打包后静态文件就在当前目录下, ...

  5. nginx如何配置负载均衡

    自己学习用 面试回答如下: 在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去.然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream ...

  6. append追加的html片段,添加点击事件没有反应,解决!

    对于追加的元素来说,属于未来展现的内容,我们此时不能使用一般点击事情处理,需要用未来事件绑定. 例如:我点击车牌号显示车辆详情,如下绑定. //绑定未来元素 $("body").d ...

  7. 自学React 入门

    刚开始学习React, 读了官网和别人的一些博客,总结了一部分内容,记录一下.有错误欢迎指正... 一.自定义组件需要了解知识 1. 组件分类 React中有两种类型的组件,一种是"方法组件 ...

  8. Angular toastr提示框

    1. 安装ngx-toastr包 npm install ngx-toastr --save 2. package.json中引入toastr样式文件 "styles": [&qu ...

  9. 我的mongoDb之旅(一)

    开发环境 php版本:7.0.10 mongodb版本:1.5 开发框架:tp5 数据库工具:navicat12formongodb 可以参考的外部文件链接 tp5中mongodb的扩展说明:http ...

  10. 【HIVE】各种时间格式处理

    yyyy-MM-dd与yyyyMMdd000000转换的三种方法 方法一:date_format(只支持yyyy-MM-dd -> yyyyMMdd000000) select date_for ...