Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)
1. 元数据和反射概念:
有关程序及其类型的数据成为元数据(metadata),他保存在程序的程序集中。
反射这个词儿听起来比较陌生。程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据的行为成为反射(reflection)
对象浏览器是显示元数据的程序的的一个示例。他可以读取程序集,然后显示所包含的类型及类型的所有特性和成员。
2.举例说明:
比如:我们现在有这样一个需求,已有三个函数fun1,fun2,fun3这三个函数,我们都找到如果我们想调用其中某个函数的时候,我们只有在代码中写好,
s.py
def fun2():
return "fun2" def fun1():
return 'fun1' def fun3():
return 'fun3'
test.py
import s #导入s.py文件。 call_str = input("input which function you want to call :") if call_str == 'fun1':
print(s.fun1())
elif call_str == 'fun2':
print(s.fun2())
elif call_str == 'fun3':
print(s.fun3())
else:
print("404 not Found")
运行文件test.py后输入对应的函数名就可以调用响应的函数了。如果在s.py文件中,有成千个函数!岂不是我们想象以上方式调用的时候写上n个判断语句,这样是不是太麻了。
所有Pyt给我们提供了强大的反射机制,这个反射机制是通过“字符串返回映射到代码中的一种机制”。
这边是反射的意思了。
3.Py中怎么使用反射:
其中Py中提供了四个反射函数
3.1 getattr函数:获取对象的方法或变量的内存地址
import s call_str = input("input which function you want to call :") # if call_str == 'fun1':
# print(s.fun1())
# elif call_str == 'fun2':
# print(s.fun2())
# elif call_str == 'fun3':
# print(s.fun3())
# else:
# print("404 not Found") obj = getattr(s, call_str) # 其中的s是值的带入的s文件,s也可以换为其他的你想倒入的模块等
print(obj()) input which function you want to call :fun1
fun1
运行后我们输入:fun1,fun2,fun3都没有问题,但是当我们乱输入一个字符串的时候getattr内置函数就报错了。当然,我们可以通过try...except语句进行判断这个问题。但是我们还可以使用hasattr这个内置函数。
3.2 hasatter函数:返回True or False
import s call_str = input("input which function you want to call :") if call_str == 'fun1':
print(s.fun1())
elif call_str == 'fun2':
print(s.fun2())
elif call_str == 'fun3':
print(s.fun3())
else:
print("404 not Found") if hasattr(s, call_str): # 判断是否存在函数 call_str,这样处理就不会报错了。
obj = getattr(s, call_str)
print(obj())
else:
print("404 not Found")
3.3 setattr函数:为对象添加变量或方法。
def abc(self):
print("%s正在交谈"%self.name) class Person(object):
def __init__(self,name):
self.name = name class Person(object):
def __init__(self,name):
self.name = name
def talk(self):
print("%s正在交谈"%self.name) p = Person("laowang")
setattr(p,"talk",abc) # 将abc函数添加到对象中p中,并命名为talk
p.talk(p) # 调用talk方法,因为这是额外添加的方法,需手动传入对象 setattr(p,"age",) # 添加一个变量age,复制为30
print(p.age) # 打印结果:
3.4 delattr函数:输出对象中的变量。注意不能删除方法。
class Person(object):
def __init__(self,name):
self.name = name
def talk(self):
print("%s正在交谈"%self.name) p = Person("laowang") delattr(p,"name") # 删除name变量
print(p.name) # 此时将报错
Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)的更多相关文章
- Python开发【第十三篇】高阶函数、递归函数、闭包
函数式编程是指用一系列函数解决问题 好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题 函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态 函数之间的可重入性 当一个函数的输 ...
- python学习三十四天函数高阶函数定义及用法
python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...
- Python中匿名函数与内置高阶函数详解
大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...
- Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用
@Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速
Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- python学习【第四篇】python函数 (一)
一.函数的介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以 ...
- Python小世界:匿名函数、高阶函数、推导式
前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...
- Python day5 --------递归、匿名函数、高阶函数、内置函数
一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...
随机推荐
- GNS3 ip route 命令解析
ip route 120.94.0.0 255.254.0.0 172.16.252.1ip route 192.168.0.0 255.255.0.0 10.10.10.119ip route 21 ...
- vCenter组件和服务
1).随VMware Platform Services Controller一起安装的服务 a. vCenter Single Sign-On身份验证服务 b. vSphere 许可证服务 c. V ...
- Python基础笔记:字符串和编码
1. 当处理文本时,需要现将文本转换为文字,一个字节为8位儿,一个字节最高表示整数255(1111 1111),对应255个状态: 最为人熟知的是ASCii码,ASCii码含128个状态,满足了英文编 ...
- sass的安装和基础语法
安装 下载ruby安装包[官网非常慢ruby官网] ruby-2.3.3-x64-mingw32.7z 下载sass sass-3.7.4.gem 方法一: ruby压缩包,解压即可,在bin目录下, ...
- 二十、SAP中定义内表
一.内表相当于传统语言的多维数组的东西,定义一个内表有以下2个方式
- centos下将系统预置yum源更换为阿里云源
参考:http://mirrors.aliyun.com/help/centos?spm=5176.bbsr150321.0.0.d6ykiD 步骤1:备份/etc/yum.repos.d/下的Cen ...
- Compare/ContrastEssay你真的会写了吗?
Compare/Contrast Essay也是留学生们常遇到的一种作业类型,但是很多留学生不知道怎么写.本文HotEssay为大家整理了Compare/Contrast Essay写作方法,希望对大 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-adjust
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- (四)requests模块的cookies和代理操作
基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取某个人“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到 ...
- centos破解压缩文件密码
rarcrack是linux系统端的一款破解加密压缩包的工具,rarcrack使用的穷举法进行破解已经加密的rar.zip和7z压缩包,支持设置多线程,和文件类型进行破解. 1.rarcrack下载页 ...