反射:通过字符串映射或修改程序运行时的状态、属性、方法

反射有以下三个方法:

hasattr(object, name)           判断一个对象(object)里是否有对应的字符串(name)的属性
getattr(object, name)            根据字符串(name)去获取对象(object)里的,对应方法的内存地址(即,获取对应的方法)
setattr(object, name,value)   给对象(object)添加属性(name)值(value)
delattr(object,name)             删除对象的属性

实例:

def sleep(self):
print('%s在睡觉' % self.name) def talk():
print('说话') class People(object):
sex = '男'
def __init__(self, name):
self.name = name def eat(self):
print('%s正在吃东西' % self.name) p = People('simple') print(hasattr(p, 'eat')) # 返回True # 判断p这个对象中是否有eat这个属性。
print(hasattr(p, 'name')) # 返回True
f = getattr(p, 'eat') # 获取eat的内存地址,即,获取eat方法
print(f) # 打印eat的内存地址
print(f()) # 打印eat的返回值,即,执行eat方法 # 变量操作
str = input('变量:').strip()
val = input('变量的值:').strip()
if hasattr(p, str): # 在p中是否存在str变量,str是用户传入的参数。如果存在,则执行以下操作。
func = getattr(p, str) # 获取p中str变量
print('原来的变量:%s=%s'%(str,func))
setattr(p,func,val) # 修改p中str变量的值
f = getattr(p,func) # 重新获取p中str变量
print('修改后的变量:%s=%s'%(str,val)) # 打印str的值
else: # 在p中不存在str变量,执行以下操作。
setattr(p,str,val) # 给p添加变量str,并赋值val --> str = val
gv = getattr(p,str) # 获取p中新添加的str变量
print('新增了变量:%s=%s'%(str,gv)) # 打印新添加的str变量值
delattr(p, str) # 删除变量
print('删除了变量:%s' % str) # 删除p中str变量
print('是否还存在变量%s:%s'%(str,hasattr(p,str))) # 删除之后,再判断属性是否存在

变量操作

执行结果:

def sleep(self):
print('%s在睡觉' % self.name) def talk():
print('说话') class People(object):
sex = '男'
def __init__(self, name):
self.name = name def eat(self):
print('%s正在吃东西' % self.name) p = People('simple') print(hasattr(p, 'eat')) # 返回True # 判断p这个对象中是否有eat这个属性。
print(hasattr(p, 'name')) # 返回True
f = getattr(p, 'eat') # 获取eat的内存地址,即,获取eat方法
print(f) # 打印eat的内存地址
print(f()) # 打印eat的返回值,即,执行eat方法 # 方法操作
str = input('方法:').strip()
if hasattr(p, str): # 在p中是否存在str方法,str是用户传入的参数。如果存在,则执行以下操作。
func = getattr(p, str) # 获取p中str方法
print('方法%s执行结果:'%(str),end='')
func() # 执行方法
else: # 在p中不存在str方法,执行以下操作。
# setattr(p,str,sleep) # 给p添加了类方法sleep,带self参数
setattr(p,str,talk) # 给p添加方法talk,不带self参数 # sleep = getattr(p,str) # 获取p中新添加的str方法的内存地址
talk = getattr(p,str) print('新增了方法:%s,返回结果:'%str) # 打印新添加的str变量值 # sleep(p) # 类方法调用,带self
talk() # 普通方法调用,不带self delattr(p, str) # 删除方法
print('删除了方法:%s' % str) # 删除p中str变量
print('是否还存在变量%s:%s'%(str,hasattr(p,str))) # 删除之后,再判断属性是否存在

方法操作

执行结果:

初识python: 反射的更多相关文章

  1. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  2. python 反射

    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...

  3. Python开发【第一篇】:初识Python

    初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  4. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  5. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  6. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

  7. 篇2 安卓app自动化测试-初识python调用appium

    篇2              安卓app自动化测试-初识python调用appium --lamecho辣么丑 1.1概要 大家好!我是lamecho(辣么丑),上一篇也是<安卓app自动化测 ...

  8. 2017-06-22初识python

    初识python #!/usr/bin/env python (python解释器的文件路径)# -*- coding:utf-8 -*- (使用的编码内型)# python 2.7 <需要加第 ...

  9. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  10. day01 初识Python

    今日主要内容 1.初识python 2.简单了解下python的数据类型 nubmer=int(input("请输入数字大小:")) if nubmer>66: print( ...

随机推荐

  1. 【Services】【Web】【LVS】lvs基础概念

    1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...

  2. arcgis api for js自定义引用方式

    (1)常规模式 ​ 即arcgis js常见的模块引用方式,采用 require-function 模式,function的参数与require一一对应即可(dojo/domReady!比较特殊,无需 ...

  3. java中注释、关键字、标识符,数据类型(上)

    一.java中的注释(有3种) 注释:是给写代码的人看的,注释不会被执行 单行注释:用符号"//"实现 多行注释:用"/* */ " 实现 javaDoc(文档 ...

  4. java 8 启动脚本优化 3

    #!/bin/bash #链接文件 source /etc/profile #java虚拟机启动参数 #通过http://xxfox.perfma.com/jvm/check来检查参数的合理性 #各参 ...

  5. c++跨平台字符编码与乱码杂谈

    blos https://article.itxueyuan.com/qpQml https://www.cnblogs.com/wangmh/p/7265258.html https://blog. ...

  6. iOS越狱插件源查找及避免插件劫持

    1.关于 iOS越狱插件源查找地址:https://www.ios-repo-updates.com/ 2.注意 不要使用不可靠的第三方源,其可能存在劫持,而你却茫然不知. 使用上面的网站查找你需要的 ...

  7. 【LeetCode】174. Dungeon Game 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  8. 【LeetCode】754. Reach a Number 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 日期 题目地址:https://leetcod ...

  9. 1057 - Collecting Gold

    1057 - Collecting Gold   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  10. Crypto CTF 2019 writeup

    Crypto CTF 2019 writeup roXen 题目 roXen Relationship with a cryptographer! The Girlfriend: All you ev ...