Python的反射机制

  Python的反射机制,就是反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

  常用的反射内置函数有四个:hasattr(),getattr(),setattr()和delattr()。我们来看看具体应该怎么使用。

首先定义一个类并实例化,再定义个字符串变量从键盘输入。

 def cry(self):
print("%s is crying!"%self.name)
class Person(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating "%(self.name))
def talk(self):
print(("%s is talking"%self.name))
p1 = Person("Jack")
action = input(">>>:")

要想用输入的字符串来调用实例中的属性或功能,用p1.action是不行的

>>>:eat
Traceback (most recent call last):
File "D:/python/week7/反射.py", line 14, in <module>
p1.action
AttributeError: 'Person' object has no attribute 'action'

运行结论

最简单暴力的方法有一种:

class Person(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating "%(self.name))
def talk(self):
print(("%s is talking"%self.name))
p1 = Person("Jack")
action = input(">>>:")
if action == 'eat':
p1.eat()
elif action == 'talk':
p1.talk()

可是如果类里定义了上百中功能,靠if来比较输入字符串显然是不靠谱的,也太low了。这时候,就用上反射了。

 class Person(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating "%(self.name))
def talk(self):
print(("%s is talking"%self.name))
p1 = Person("Jack")
action = input(">>>:")
if hasattr(p1,action): #hasattr(obj,func_str):判定实例内是否有名字为str的功能或属性
print(getattr(p1,action)) #gatattr(obj,func_str):返回实例内名字为str的功能的地址或属性的值
                     如果action = name,运行结果为Jack,如果action=eat,则返回值为eat()在内存中的地址

通过hasattr()函数来判定实例内是否包含输入名字和字符串一致的属性或功能,返回值为Ture 或False 就可以和if等指令配合使用。

注意getattr()的返回值,如果输入字符串的是属性名字,则返回值为属性的值,而输入的是功能的名字,返回值就是地址,换句话说在地址后加(),并在括号内加上实参,就能运行函数。

 class Person(object):
def __init__(self,name):
self.name = name
def eat(self,food): #这里加了个形参
print("%s is eating %s"%(self.name,food))
def talk(self):
print(("%s is talking"%self.name))
p1 = Person("Jack")
action = input(">>>:")
if hasattr(p1,action):
done = getattr(p1,action)
done("cake") #在这里给形参food传递实参
>>>:eat
Jack is eating cake

运行结果

setattr()用来对实例的属性或功能进行更改或添加。

 def cry(self):          #定义了一个类里没有的函数
print("%s is crying!"%self.name)
class Person(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating %s"%(self.name,food))
def talk(self):
print(("%s is talking"%self.name))
p1 = Person("Jack")
action = input(">>>:")
if hasattr(p1,action):
pass
else:
setattr(p1,action,cry) #setattr(obj,a,b)把名为b的功能添加在obj中,新功能/属性名为a
done = getattr(p1,action)
done(p1) #这里比把p1作为实参传递给新添加的功能
>>>:cry
Jack is crying!

运行结果

在上例中输入字符串为“cry”,实例中没有,就通过setattr()增加新的功能。然后用getattr()调用新添加的功能,这里一定要把实例作为实参传给新添加的功能(因为定义的cry需要调用实例里的属性)

setattr()还可用作更改实例的属性,如果属性内不含输入的字符串,则增加新的属性。

 setattr(p1,action,"Lucy")
print(p1.name)    #在输入name后,p1的name就编程Lucy了。

最后,delattr()用来删除实例中的属性或功能具体用法就是delattr(obj,str)删除boj内名为str的功能或属性。

Python 反射机制的更多相关文章

  1. Python反射机制理解

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

  2. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  3. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  4. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  5. python: 反射机制;

    import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...

  6. 【Python】python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  7. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

  8. python 反射机制 ( 广泛应用于URL参数)

    web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...

  9. Python ————反射机制

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

随机推荐

  1. php中in_array一些问题

    var_dump(in_array(1,['s','1fsdf',12])); // true var_dump(in_array(0,[4,'erdd']));  // true 因为是要用值与数组 ...

  2. 全国高校绿色计算大赛 预赛第一阶段(C++)第4关:计算日期

    挑战任务 我们吃的食物都有保质期,现在食品监督管理局想要制作一个能准确计算食品过期日期的小程序,需要请你来进行设计. 例如:A食品在2018年1月1日生产,保质期是20天,则它的过期日期在2018年1 ...

  3. 第二章 向量(d2)有序向量:二分查找

  4. 关于 No buffer space available (maximum connections reached?): connect 的处理

    一.问题: hudson一个应用打包部署一直不成功,检查报错 检查项目的JOB配置,开始以为是SVN的问题,但是重启SVN后问题一直存在 二.分析: TCP协议中,关闭TCP连接的是Server端(当 ...

  5. c++面向行的输入getline()和get()

    来源:c++ primer plus 在c++里当我们输入一个字符串时习惯用cin,但是cin只能读取一段不含空格的字符串,如果我们需要读取一段包含空格的字符串时,就需要用到getline()或get ...

  6. NYOJ_矩形嵌套(DAG上的最长路 + 经典dp)

    本题大意:给定多个矩形的长和宽,让你判断最多能有几个矩形可以嵌套在一起,嵌套的条件为长和宽分别都小于另一个矩形的长和宽. 本题思路:其实这道题和之前做过的一道模版题数字三角形很相似,大体思路都一致,这 ...

  7. Oracle触发器用法实例详解

    转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...

  8. ES6之对象的简洁表示法

    ES6 允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. let name = 'Pirates of the Caribbean', index = 5, captain = { ...

  9. 微信小程序开发——超链接或按钮点击跳转到其他页面失效

    1. 超链接导航失效: 小程序规则——wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面

  10. Q in Q

    简介 Q in Q技术(也称Stacked VLAN 或Double VLAN).标准出自IEEE 802.1ad,将用户私网VLAN Tag封装在公网VLAN Tag中,使报文带着两层VLAN Ta ...