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

反射有以下三个方法:

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. 【HarmonyOS】【DevEco Studio】NOTE04:How to Jump to a Page(页面间的跳转)

    页面创建与基本设置 创建页面 创建两个新页面,分别为AbilityPage1.AbilityPage2 设置页面基本内容 以AbilityPage1为例 导包 import com.example.m ...

  2. python3.6.4 scrapy框架from PIL import Image报错 from . import _imaging as core

    scrapy框架爬取url下载图片时,用ImagesPipeline下载图片 from PIL import Image报错 from . import _imaging as core Import ...

  3. SpringCloud技术涵盖简介

    SpringCloud是微服务架构的集大成者,云计算最佳业务实践. 我们平常使用的Spring和他们的关系,对Spring,springboot , SpringCloud 的 概念区分,上图: Sp ...

  4. SQL->Python->PySpark计算KS,AUC及PSI

    KS,AUC 和 PSI 是风控算法中最常计算的几个指标,本文记录了多种工具计算这些指标的方法. 生成本文的测试数据: import pandas as pd import numpy as np i ...

  5. Mysql资料 锁机制

    目录 一.简介 二.类型 三.操作 四.死锁 第一种情况 第二种情况 第三种情况 一.简介 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同 ...

  6. 【antd】如何自定义antd组件form表单中Form.Item里的内容组件

    需求:现有一个form表单,但是其中一个元素比较复杂,并不是简单的输入框或者下拉框之类的.但是我又希望能通过form.validateFields().then()去获得它的值,就不需要在当前页面写大 ...

  7. XGBoost特征选择

    1. 特征选择的思维导图 2. XGBoost特征选择算法 (1)  XGBoost算法背景 2016年,陈天奇在论文< XGBoost:A Scalable Tree Boosting Sys ...

  8. [BUUCTF]PWN——axb_2019_fmt32

    axb_2019_fmt32 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入 alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设 ...

  9. Element-UI 使用 class 方式和 css 方式引入图标

    今天在使用 vxe-table 时,需要引入 Element UI的图标,顺便就找了下这些组件库中图标的引用方式. 我们知道 Element .Ant Design.Font Awesome 等很多组 ...

  10. 批处理文件 .bat 并行Arcpy脚本提高效率的思路-提升版

    目录 前言 Arcpy脚本 导入库 函数定义 循环实现 批处理(.bat)脚本 前言 我在之前的博客园博客里,阐述了如何编写Arcpy脚本,如何利用Windows bat批处理脚本同时打开多个cmd窗 ...