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

反射有以下三个方法:

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. 【Java 与数据库】How to Timeout JDBC Queries

    How to Timeout JDBC Queries JDBC queries by default do not have any timeout, which means that a quer ...

  2. 【力扣】649. Dota2 参议院

    Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决定.他们以一个基于轮为过程的投 ...

  3. 网络协议之:还在用HTTP代理?弱爆了!快试试SOCKS5

    目录 简介 为什么要使用SOCKS SOCKS5 SOCKS5的使用 总结 简介 存在即是合理,SOCKS5的出现是为了解决SOCKS4中不支持身份认证的大问题而出现的,毕竟大家对网络中的安全越来越重 ...

  4. Abp Vnext 替换Redis的实现为csredis

    Host项目安装csredis的nuget包和data protect包并 移除 Microsoft.Extensions.Caching.StackExchangeRedis Microsoft.A ...

  5. Nginx安全检查

    1.检查是否配置Nginx账号锁定策略 描述 1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ..... (Pass ...

  6. 『学了就忘』Linux系统管理 — 83、Linux中进程的查看(top命令)

    目录 1.top命令介绍 2.top命令示例 3.top命令输出项解释 4.top命令常用的实例 1.top命令介绍 top命令是用来动态显示系统中进程的命令. [root@localhost ~]# ...

  7. 谱聚类算法—Matlab代码

    % ========================================================================= % 算 法 名 称: Spectral Clus ...

  8. ciscn_2019_c_1 1

    步骤: 先checksec,看一下开启了什么保护 可以看到开启了nx保护,然后把程序放入ida里面,观察程序代码 先shift+f12观察是否有system和binsh函数 发现没有system和bi ...

  9. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置

    1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...

  10. 网络编程socket 结合IO多路复用select; epool机制分别实现单线程并发TCP服务器

    select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...