day27-反射
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-反射的更多相关文章
- day27:反射和双下方法
1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...
- day27(反射之内省机制)
内省 内省:底层是使用反射机制实现的,是对于反射的进一步封装. 反射:通过类名来获取类中的所有属性和方法及类中的所有隐藏的方法. 内省:通过一个标准类(javabean类)来获取bean中的字段.ge ...
- day27<反射&JDK5新特性>
反射(类的加载概述和加载时机) 反射(类加载器的概述和分类) 反射(反射概述) 反射(Class.forName()读取配置文件举例) 反射(通过反射获取带参构造方法并使用) 反射(通过反射获取成员变 ...
- day27(反射之内省机制实现BeanUtils)
使用内省方式来实现beanUtils往对象里面存值 public class BeanInfoUtil2 { public static void setPropertyByIntrospector( ...
- python 反射和内置方法
一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...
- day27:异常&反射
目录 认识异常处理 1.程序错误的种类 2.异常的分类 3.AssertionError(断言assert语句失败) 异常处理的基本语法 1.异常处理的基本语法 2.带有分支的异常处理 3.处理 ...
- day27
27.01 反射(类的加载概述和加载时机) 1.类的加载 当程序要使用某个类时,如果该类还未加载到内存中,系统会通知加载,连接,初始化三步来实现对这个类初始化 a.加载 是指将.class文件读入内存 ...
- Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射
1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...
- 隐私泄露杀手锏 —— Flash 权限反射
[简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
随机推荐
- PAT 乙级 1020 月饼 (25) C++版
1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食 ...
- 『Hi,我是易建科技eKing Cloud!』
写在前面:这是我的第一篇自我介绍式文章,是对易建科技我所在云服务事业群的云平台产品和业务的总结和介绍.本文始发于 Linux宝库 公众号,这是原文链接.感谢公众号主人陈绪总,感谢公众号的编辑们!感谢易 ...
- bundle adjustment原理(1)
那些光束平差的工具,比如SBA.SSBA之类的虽然好,然而例子和教程都不够多且不够详细,让初学者难以上手. 要传入的参数虽然有解释,然而却也不是十分清楚其含义,具体要怎么生成,生成为什么形式. 我在折 ...
- k8s服务发现和负载均衡(转)
原文 http://m635674608.iteye.com/blog/2360095 kubernetes中如何发现服务 如何发现pod提供的服务 如何使用kube-dns发现服务 servic ...
- 使用Spring MockMVC对controller做单元测试(转)
https://www.cnblogs.com/ylty/p/6420738.html 1.对单一controller做测试. import org.junit.Before; import org. ...
- mongodb json序列化时间格式
利用bson解决 type error 报错问题. # 序列化 from bson import json_util import json aa = json.dumps(anObject, def ...
- python之路——1
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 学习内容 python的历史: python2 源码不标准,混乱,重复代码太多, python3 统一 标准 ...
- springMVC的执行流程和完整代码
一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...
- java 获取两个日期之间的所有天数
Calendar start = Calendar.getInstance(); start.set(2017, 2, 20); Long startTIme = start.getTimeInMil ...
- requests模块学习
- 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...