1、介绍

  反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

  python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

  对类进行反射操作,执行的结果是查询或修改类的属性
  对实例化对象进行反射操作,执行的结果是查询或修改实例化对象的属性

2、四个可以实现自省的函数

hasattr(对象名,'属性名') #判断对象中是否存在该属性
getattr(对象名,'属性名', 默认值可选) #获取对象中的该属性的值,可以添加默认值
setattr(对象名,'属性名', vlaue) #设置对象中的该属性名的值为vlaue
delattr(对象名,'属性名') #删除对象中的该属性

3、例子

1:对象示例(一切皆对象,类本身也是一个对象)

class Foo:
def __init__(self, name, age):
self.name = name
self.age = age def say_hi(self):
print('hi,%s'%self.name) #检测是否含有某属性
obj = Foo('Tom', 25)
print(hasattr(obj, 'name'))
# True
print(hasattr(obj, 'say_hi'))
# True #获取属性
name = getattr(obj, 'name')
print(name)
# Tom
print(getattr(obj, 'name1', '不存在'))
# 不存在 #如果不加默认值就会报错
func = getattr(obj, 'say_hi')
if func:
func()
# hi, Tom #设置属性
setattr(obj, 'sex', 'man')
print(obj.sex)
# man #删除属性
delattr(obj, 'sex')
print(obj.__dict__)
{'name': 'Tom', 'age': 25}
delattr(obj, 'name1')
#不存在,则报错,AttributeError: name1

例子2:对类的示例

class Foo(object):
staticField = "old boy" def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' @staticmethod
def bar():
return 'bar' print(getattr(Foo, 'staticField'))
#old boy
ret1 = getattr(Foo, 'func')
print(ret1(1))
#func 传入参数1,并执行ret1获取的方法
print(getattr(Foo, 'func')(1))
#func
print(getattr(Foo, 'bar')())
#bar

例子3:对当前模块的示例

import sys
def s1():
print('s1') def s2():
print('s2') this_module = sys.modules[__name__] print(hasattr(this_module, 's1'))
# True
getattr(this_module, 's2')()
# s2

例子4:其他模块的示例

#一个模块中的代码
def test():
print('from the test')
"""
程序目录:
module_test.py
index.py 当前文件:
index.py
""" # 另一个模块中的代码
fs.py文件有如下代码
n1 = 'Tom'
def func():
print(666) class A:
name = 'Mike'
def func2(self):
print('--------IN FUNC2') test.py文件有如下代码:
import fs
print(getattr(fs, 'n1'))
# Tom 可以从导入的fs模块中获取到n1属性
ret1 = getattr(fs, 'func')
ret1()
# 666 可以从导入的fs模块中获取func方法并执行 ret2 = getattr(fs, 'A')
print(ret2.name)
# Mike 可以从导入的fs模块中获取A类,打印A类的name属性 print(getattr(fs.A, 'name'))
# Mike 可以从导入的fs模块中的A属性中获取name属性并执行 ret3 = getattr(fs.A, 'func2')(1)
# --------IN FUNC2 获取func2方法,并传入参数1执行

day27-反射的更多相关文章

  1. day27:反射和双下方法

    1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...

  2. day27(反射之内省机制)

    内省 内省:底层是使用反射机制实现的,是对于反射的进一步封装. 反射:通过类名来获取类中的所有属性和方法及类中的所有隐藏的方法. 内省:通过一个标准类(javabean类)来获取bean中的字段.ge ...

  3. day27<反射&JDK5新特性>

    反射(类的加载概述和加载时机) 反射(类加载器的概述和分类) 反射(反射概述) 反射(Class.forName()读取配置文件举例) 反射(通过反射获取带参构造方法并使用) 反射(通过反射获取成员变 ...

  4. day27(反射之内省机制实现BeanUtils)

    使用内省方式来实现beanUtils往对象里面存值 public class BeanInfoUtil2 { public static void setPropertyByIntrospector( ...

  5. python 反射和内置方法

    一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...

  6. day27:异常&反射

    目录 认识异常处理 1.程序错误的种类    2.异常的分类 3.AssertionError(断言assert语句失败) 异常处理的基本语法 1.异常处理的基本语法 2.带有分支的异常处理 3.处理 ...

  7. day27

    27.01 反射(类的加载概述和加载时机) 1.类的加载 当程序要使用某个类时,如果该类还未加载到内存中,系统会通知加载,连接,初始化三步来实现对这个类初始化 a.加载 是指将.class文件读入内存 ...

  8. Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射

    1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...

  9. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  10. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

随机推荐

  1. NPOI导出Excel2007板

    Excel2003有最大行限制相信大家在日常导出时都不会考虑再使用Excel2003,其实NPOI是一个听简单又好用的多里office组件的导出插件. 为了便于以后使用记录一下 第一步下载NPOI插件 ...

  2. 廖雪峰Java4反射与泛型-3范型-4擦拭法

    1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...

  3. webview之总结2

    21,js与androud交互之javascript调用本地之方法一(接口类): ========= 21,js与androud交互之javascript调用本地之方法一(接口类): Android4 ...

  4. android adb push 命令

    1.获得root权限:adb root 2.设置/system为可读写:adb remount 3.将PC机上文件复制到手机:adb push 文件名  /system/lib

  5. Access、SQLServer、Oracle常见SQL语句应用区别

    Access.SQLServer.Oracle常见SQL语句应用区别 关劲松 PMP 如果要兼容Access.SQL Server.Oracle三个数据库版本:我们在编写SQL语句的过程中,尽量使用一 ...

  6. 用node.js和webpack做前后端分离的总结

    1.webpack打包的特点 (打包文件到指定地点,修改原文件里的引用路径为打包的地点) 涉及output的path/public path/dev-server里的public path等概念 we ...

  7. C#列的一些操作

    //变更列名 DataTableA.Columns["原来的列名"].ColumnName="新的列名";

  8. 多线程Task

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. PHP:引用PhpExcel导出数据到excel表格

    我使用的是tp3.2框架(下载地址:http://www.thinkphp.cn/topic/38123.html) 1.首先要下载PhpExcel类库,放在如下图目录下 2.调用方法 public ...

  10. Hadoop2.6.5集群搭建

    一. Hadoop的分布式模型 Hadoop通常有三种运行模式:本地(独立)模式.伪分布式(Pseudo-distributed)模式和完全分布式(Fully distributed)模式.安装完成后 ...