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)的更多相关文章

  1. Python开发【第十三篇】高阶函数、递归函数、闭包

    函数式编程是指用一系列函数解决问题 好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题 函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态 函数之间的可重入性 当一个函数的输 ...

  2. python学习三十四天函数高阶函数定义及用法

    python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...

  3. Python中匿名函数与内置高阶函数详解

    大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...

  4. Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用

    @Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...

  5. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  6. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  7. python学习【第四篇】python函数 (一)

    一.函数的介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以 ...

  8. Python小世界:匿名函数、高阶函数、推导式

    前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...

  9. Python day5 --------递归、匿名函数、高阶函数、内置函数

    一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...

随机推荐

  1. 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 ...

  2. vCenter组件和服务

    1).随VMware Platform Services Controller一起安装的服务 a. vCenter Single Sign-On身份验证服务 b. vSphere 许可证服务 c. V ...

  3. Python基础笔记:字符串和编码

    1. 当处理文本时,需要现将文本转换为文字,一个字节为8位儿,一个字节最高表示整数255(1111 1111),对应255个状态: 最为人熟知的是ASCii码,ASCii码含128个状态,满足了英文编 ...

  4. sass的安装和基础语法

    安装 下载ruby安装包[官网非常慢ruby官网] ruby-2.3.3-x64-mingw32.7z 下载sass sass-3.7.4.gem 方法一: ruby压缩包,解压即可,在bin目录下, ...

  5. 二十、SAP中定义内表

    一.内表相当于传统语言的多维数组的东西,定义一个内表有以下2个方式

  6. centos下将系统预置yum源更换为阿里云源

    参考:http://mirrors.aliyun.com/help/centos?spm=5176.bbsr150321.0.0.d6ykiD 步骤1:备份/etc/yum.repos.d/下的Cen ...

  7. Compare/ContrastEssay你真的会写了吗?

    Compare/Contrast Essay也是留学生们常遇到的一种作业类型,但是很多留学生不知道怎么写.本文HotEssay为大家整理了Compare/Contrast Essay写作方法,希望对大 ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-adjust

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. (四)requests模块的cookies和代理操作

    基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取某个人“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到 ...

  10. centos破解压缩文件密码

    rarcrack是linux系统端的一款破解加密压缩包的工具,rarcrack使用的穷举法进行破解已经加密的rar.zip和7z压缩包,支持设置多线程,和文件类型进行破解. 1.rarcrack下载页 ...