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. tcpdump命令(转载)

    https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the tra ...

  2. Hadoop+Hbas完全分布式安装部署

    Hadoop安装部署基本步骤: 1.安装jdk,配置环境变量. jdk可以去网上自行下载,环境变量如下: 编辑  vim  /etc/profile 文件,添加如下内容: export JAVA_HO ...

  3. [UE4]根据名字调用函数(蓝图)

    一.Set Timer by Function Name 二.Set Timer by Event

  4. [UE4]非常实用的SizeBox控件

    Desired:表示以期望的实际尺寸显示视图. SizeBox最好作为Child Widget的根节点.(如果SizeBox的父节点是Canvas Panel,SizeBox会变成可拉伸,ChildL ...

  5. [UE4]动态改变UniFormGird子控件的row属性

  6. AMQP & JMS对比(转载)

    AMQP & JMS对比 原文地址:https://blog.csdn.net/hpttlook/article/details/23391967 初次接触消息队列时,在网上搜索,总是会提到如 ...

  7. Webpack打包方式及各场景下模块化语法总结

    1.nodejs的方式:commonjs  var xx =require()   modules.exports=xxxx 注意:这种方式引入模块,路径会遵循node的规则,和js的src路径规则不 ...

  8. Mybatis 系列1-环境搭建

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  9. 如何使用Python操纵Postgres数据库

    pip install psycopg2 psycopg2-binary #!/usr/bin/python import psycopg2conn = psycopg2.connect(databa ...

  10. (转)C#连接Oracle数据库(直接引用dll使用)

    原文地址:http://www.cnblogs.com/gguozhenqian/p/4262813.html 项目中有个功能需要从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的S ...