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注解框 ...
随机推荐
- csv文件操作
1.python2中: import csv infos = [ ['peter','male'], ['marry','female'], ['johon','male'], ['rose','fe ...
- jquery load()函数和window.onload事件
我想用jquery load()一个饼状图页面, 但是load不出来 代码如下: 后来百度了一下,解决办法如下: window.onload事件只有在文档载入的时候才会执行的,你载入子页面不会触发这个 ...
- mybatisz中一个可以替代between..and 的技巧
用mybatis进行时间段筛选时,如果,查询本日,本月的信息量,我们可以使用like concat()函数来替换between..and <select id="queryMyStaf ...
- HDOJ 2001 计算两点间的距离
#include<iostream> #include<cstdio> using namespace std; int main() { double a, b, x, y; ...
- [UE4]Vertical Box结合Horizontal Box创建出类似微信的经典手机界面
头部标题,中部为自动填充,底部为一个Horizontal Box,其中的“通讯录”文字比较宽,需要设置Size.Fill=1.5
- [UE4]在C++中使用中文变量和中文注释
一.如果直接在C++中使用中文变量名称,在UE4中编译是会出错的,方法的中文注释也会在UE4中变成乱码 二.只要将h文件和cpp文件用记事本另存为utf-8编码就可以了. 也可以配置VS环境: 如何解 ...
- [UE4]Replications,复制
关于进程 1.进程:运行中的程序 虚幻4游戏进程的四种网络模式 1.StandAlone:单机模式,不联网 2.Client,网络游戏中的客户端. 3.ListenServer,服务器和一个客户端 4 ...
- T-SQL 有参数存储过程的创建与执行
use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery2') drop procedur ...
- T-SQL 简单子查询
1.使用变量的方式实现的查询 use StudentManageDB go declare @StuId int --查询张永利学号 select @StuId=StudentId from Stud ...
- UE4 Socket多线程非阻塞通信
转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...