一、反射
python 中用字符串的方式操作对象的相关属性,python 中一切皆对象,都可以使用反射
用eval 有安全隐患,用 反射就很安全
1.反射对象中的属性和方法
class A:
a_class = '反射类静态属性'
@classmethod
def func_class(cls):
return '反射类方法'
def __init__(self, name):
self.name = name
print('%s是对象属性' % (self.name))
def func(self):
return '反射对象方法'
2、getatter   获取
1. 反射对象中的属性和方法
a = A('zzy') # zzy是对象属性 实例化的时候会触发init,打印zzy是对象属性
原版:a.name
ret = getattr(a, 'name') #
print(ret) # zzy
原版:a.func()
ret2 = getattr(a, 'func')
print(ret2) #<bound method A.func of <__main__.A object at 0x01B5EBB0>>打印的是函数地址,并没有调用
ret2() #加括号就表示调用,打印‘对象方法’
简洁版
print(getattr(a, 'name')) #zzy是对象属性,zzy
print(getattr(a,'func')()) #反射对象方法

例二

2.反射类的静态属性和方法
#原版:A.func_class()
print(getattr(A,'func_class')()) #zzy是对象属性
print(getattr(a,'func_class')()) #反射类方法---->>用对象调用类方法也可以,但是不推荐,
#原版:A.a_class
print(getattr(A,'a_class')) #反射类静态属性
"""
注释:getattr (对象/类,‘属性/方法’) 属性/方法必须是字符串形式
getattr 反射方法的时候,要在末尾加(),才能算是调用,否则打印的只是函数地址
"""
要反射的函数有参数怎么办?
# print(time.strftime('%Y-%m-%d %H:%M:S'))
# print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
3、hasattr  有
#判断需要反射的对象是否存在,和getattr是夫妻档,判断存在的时候,才会执行getattr
if hasattr(a,'name'):
print(getattr(a,'name')) # zzy是对象属性 zzy
4、setattr  设置修改变量
class A:
pass
a = A()
setattr(a,'name','nezha') #在对象a中新建属性name属性,并且赋值'nezha'
setattr(A,'name','alex') #在A类中新建静态属性name属性,并且赋值'alex'
print(A.name) #alex
print(a.name) #'nezha

setattr

5、delattr 删除一个变量
delattr(a,'name')     #删除对象a中新建属性name属性
print(a.name) #删除后打印会报错
delattr(A,'name') #删除在A类中新建静态属性name属性
print(a.name) #删除后打印会报错

delattr

6、进阶使用1,涉及用户交互
变量名=input('请输入:')
print(getattr(a,变量名)) #zzy
练习,需求:用户输入time 和 asctime打印出time.time/asctime
import time
t=input('请输入:') #输入time / asctime
print(getattr(time,t)()) # 因为输入的是time / asctime,而
#注释:说明内置函数也是可以反射的

练习

7、进阶使用2,涉及其他导入模块的反射
(1)反射其他模块
import sys
import model
b=model.B('zzy')
#反射模块的类属性
原版:print(b.name)
print(getattr(b,'name')) #zzy
#反射模块类方法
原版: b.func1()
print(getattr(b,'func1')()) #你好
(2)反射模块中变量
import model
#原版:model.soga       #   model模块 中有soga=input('请输入:')

print(getattr(model,'soga')) #打印你输入的内容 #反射模块中的函数
# 原版model.foo()
print(getattr(model,'foo')('zxc')) #zxc 函数中有参数的话,就可以在括号里('zxc')传进去
(3)反射模块中的函数
# 原版model.foo()
# print(getattr(model,'foo')('zxc')) #zxc 函数中有参数的话,就可以在括号里('zxc')传进去
8、进阶3:反射自己模块
(1)导入自己模块的变量
msg=1+2print(getattr(sys.modules['__main__'],'msg')
(2)导入自己模块的函数
def foo (a):
return a
print(getattr(sys.modules[__name__],'foo')('zxc')) #zxc
(3)反射自己模块的类
class C:
a_class = '反射模块类静态属性'
@classmethod
def func_class(cls):
return '反射模块类方法'
def __init__(self, name):
self.name = name
@property
def func_c(self):
return '反射模块对象方法'
@staticmethod
def func():
return '我是一个普通的函数'

类函数

import sys
c=C('ZZY')
print(getattr(sys.modules['__main__'],'C')) #<class '__main__.C'> 类的函数地址
print(getattr(sys.modules['__main__'],'c')) #<__main__.C object at 0x01B77210> 对象的函数地址
print(getattr(sys.modules['__main__'],'c').name) #ZZY 对象.name 就可以调用自己模块中类的方法名了
print(getattr(sys.modules['__main__'],'C').func_class()) #反射模块类方法
print(getattr(sys.modules['__main__'],'c').func_c) #反射模块对象方法
print(getattr(sys.modules['__main__'],'C').func()) #我是一个普通的函数
#注释:sys.modules['__main__']找到当前运行的模块
#最好用sys.modules['__name__'],因为__name__ 永远获取的是__name__所在的模块

反射

9、比较区别
先在一个reflect.py文件中打印
print(sys.modules[__name__])
print(sys.modules['__main__'])
再在另一个model.py文件在中执行下列
import reflect      #导入reflect模块了,就会执行reflect模块中的程序

#reflect  中运行了print(sys.modules[__name__])
就会打印:<module 'reflect' from 'D:\\Users\\ZhaoYun Zhu\\PycharmProjects\\reflect.py'> # reflect 中运行了print(sys.modules[__main__])
就会打印:<module '__main__' from 'D:/Users/ZhaoYun Zhu/PycharmProjects//model.py'> # 总结:sys.modules['__main__']找到当前运行的模块
# 最好用sys.modules['__name__'],因为__name__ 永远获取的是__name__所在的模块

python--reflect的更多相关文章

  1. python的反射

    目前大多数网站都是通过路由的方法来,处理url请求,如果有很多个url的话,不停的include或者用if判断匹配,似乎不太符合情理,因此这里讲讲python的反射机制, 自动装在模块.请看下面的实例 ...

  2. python的reflect反射方法

    核心内容专自:http://www.liujiangblog.com/course/python/48 在自动化测试的时候,需要从excel中读取关键字,此关键字对应一个方法,如何使用该关键字去调用真 ...

  3. Atitit.http代理的实现 代码java php c# python

    Atitit.http代理的实现 代码java php c# python 1. 代理服务器用途 代理服务器看成是一种扩展浏览器功能的途径.例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据 调 ...

  4. Python开发程序:RPC异步执行命令(RabbitMQ双向通信)

    RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...

  5. python中from module import * 的一个陷阱

    from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...

  6. python学习笔记整理——dictView [未整理]

    Dictionary view objects简介 The objects returned by dict.viewkeys(), dict.viewvalues() and dict.viewit ...

  7. Python之反射

    一.引言 有时候我们会碰到类似这样的需求,就是想要执行类的某个方法,或者需要对对象的某个参数赋值,而方法名或参数名已经包装在类中并不能去顶,需要通过参数传递字符串的形式输入.在这样的情况你会选择什么样 ...

  8. python的反射机制

    转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...

  9. Python中reactor,factory,protocol

    最为简单的情况下,除了了解清reactor的简单使用,你还要了解Protocol和Factory.它们最终都会由reactor的侦听建立和run来统一调度起来. 建立服务器的第一个要解决的问题就是服务 ...

  10. Python内置模块(2)

    这一部分主要介绍sys.os.hashlib和re模块.其中的re模块介绍得非常详细,是本部分的重点! 均为python3.5.1环境. 一.sys模块 sys模块涉及的主要是与python解释器相关 ...

随机推荐

  1. 现在就去100offer 参加互联网人才拍卖! 现在登录现在注册 为什么整个互联网行业都缺前端工程师?

    现在,几乎整个互联网行业都缺前端工程师,不仅在刚起步的创业公司,上市公司乃至巨头,这个问题也一样存在.没错,优秀的前端工程师简直比大熊猫还稀少. 每天,100offer的HR群都有人在吐槽招不到前端工 ...

  2. Java中创建String的两道面试题及详解

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  3. ssh文件 ip锁定

    vi ~/.ssh/config Host web*hostname 115.29.242.1**user lian Host **hostname 192.168.1.**user dface

  4. 装完某些软件之后IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持

    今天重装电脑,装完某些软件之后发现IE主页被https://www.hao123.com/?tn=93453552_hao_pg劫持,然后百度各种解决方法都没用,甚至是修改注册表依然没啥用 最后忽然看 ...

  5. react todelist

    1.点击按钮提交,新增对象 buttonChange() { this.setState({ //展开运算符...this.state.list,生成一个全新的数组 // list:[...this. ...

  6. Spring boot自定义拦截器和拦截器重定向配置简单介绍

    大家好: 本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题. 开发工具:jdk1.8   idea2017(付费版,网上找的破解教程) 1,首先使用idea创建一个Sp ...

  7. 【算法】BitMap

    转自:https://www.seoxiehui.cn/article-45186-1.html 需求: 为满足用户标签的统计需求,小灰利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mys ...

  8. Android中TextView不获取焦点可以实现跑马灯的效果

    之前在网上找了很多关于TextView的跑马灯效果实现的例子,实现起来都存在一些问题,例如一种是完全重画一个跑马灯,还有就是只设置TextView的相关属性使其具有跑马灯的效果,总的来说这两种方法都是 ...

  9. Delphi内建异常类 异常处理参考

    标签: delphiexceptionwindowscasting编程integer 2012-05-19 12:53 2579人阅读 评论(0) 收藏 举报 分类: Delphi(96) [详细过程 ...

  10. docker学习路线图

    https://yq.aliyun.com/articles/40494?spm=a2c4e.11153959.teamhomeleft.23.6ea918b1KErlfs