什么是反射?

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. 一些简单的Linux命令(centos修改网络ip,修改主机名)

    环境:linux centos 7 vi /etc/sysconfig/network-scripts/ifcfg-enp3s0f0 可以修改网关地址,网络IP地址,子网地址等等 [root@loca ...

  2. 微信支付中分账功能 填坑指南V1

    公司是做电商的,近期开发了一款小程序,准备线上线下同步销售玩具.这里就涉及到微信支付的功能,网上有很多教程,官方也有文档和Demo,因此微信支付还是比较容易实现的. 由于我们公司是和其他公司合作运营的 ...

  3. 自动更新Aria2中的bt-trackers选项

    #!/bin/bash /usr/sbin/service aria2 stop list=`wget -qO- https://raw.githubusercontent.com/ngosang/t ...

  4. Java位运算符&、|、^、>>、<<、~、>>>

    如果要搞懂Java中的位运算符,首先要搞懂二进制的运算,之前一篇有介绍详细请看 二进制运算-十进制与二进制的转换 Java中的位运算符有:&(按位与).|(按位或).^(按位异或).>& ...

  5. 【数据结构】什么是AVL树

    目录 什么是AVL树 1. 什么是AVL树 2. 节点的实现 3. AVL树的调整 3.1 LL旋转 3.2 RR旋转 3.3 RL旋转 3.4 LR旋转 什么是AVL树 二叉查找树的一个局限性就是有 ...

  6. mysql 5.5之参数详解

    [mysql]default-character-set=utf8 [mysqld] datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock # ...

  7. [LeetCode]singleNumber

    题目:singleNumber Given an array of integers, every element appears twice except for one. Find that si ...

  8. 使用Nexus3搭建Maven私服

    1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...

  9. Flutter学习笔记(27)--数据共享(InheritedWidget)

    如需转载,请注明出处:Flutter学习笔记(27)--数据共享(InheritedWidget) InheritedWidget是Flutter中非常重要的一个功能型组件,它提供了一种数据在widg ...

  10. Intellij IDEA 2019 + Java Spring MVC + Hibernate学习笔记(2)

    书接上文 首先根据各种Spring MVC教程,建立了基础的结构,是否合理不知道,姑且先这样,有问题再解决问题.学习新东西,不能怕掉坑里... 查询网上别人的经历说需要把根目录下的lib目录下的所有包 ...