什么是反射

光在两种物质分界面上改变传播方向又返回原来物质中的现象,叫反射!

以上,是反射的物理定义,与python中的反射概念,完全没有任何关系

书归正传:反射

就是通过字符串的形式,操作对象相关的属性

反射的相关函数:

hasattr(object,"name")

#返回bool类型,判断object的命名空间中是否存在name这个名字

#存在返回True

#不存在返回Flase

obj = getattr(object,"name")

#获得Object中名称为name的内存地址

#name可以是一个方法,也可以是一个属性

setattr(Object,"name","egon")

#在Object中添加一个name名字,并赋值egon

#在Object的__dict__中就可以看到{"name":"egon"}了

delattr(Object,"name")

#在Object中删除名称为name的内存地址

为什么要用反射,反射有什么优势

实现可插拔机制

例如:程序员A负责写模块,程序员B负责调用,当程序员A的模块没有完成,程序员B依然可以将代码完成,而且与程序员A的工作不相冲突

代码示例:

1 # 编辑者:闫龙

2 class ftpc:

3 def __init__(self,x):

4 print("come no baby",x)

5 def getFile(self):

6 print("反正里面有文件")

7 def upFile(self):

8 print("你就当上传成功了一个叫FuckEgon的文件")

程序员A的未完成模块

1 # 编辑者:闫龙

2 import FtpClient

3 class FtpS:

4 def __init__(self):

5 print("服务端已开启")

6 def Go(self):

7 ftpc = FtpClient.ftpc("egon")

8 while True:

9 userin = input(">>>:")

10 if(hasattr(ftpc,userin)):#在这里就是判断程序员A未完成的代码中是否存在某方法,如果存在则执行,不存在则提示指令错误

11 ftpp = getattr(ftpc,userin)

12 ftpp()

13 else:

14 print("指令错误")

15 continue

16

17 f = FtpS()

18 f.Go()

程序员B的实现

动态导入模块

我们在导入模块的时候会用到Import 模块名,而这个模块名并不是一个字符串,那么使用应的好处就是可以对应字符串转成相应的模块

代码示例:

1 #官方推荐版:egon坑货版

2 import importlib #导入一个improtlib模块

3 Choice = input(">>>")#获取用户输入的信息(模块名字)

4 importlib.import_module(Choice)#将用户输入的字符串变成模块的名字并导入模块

5

6 #矮根儿先入为主版:官方根本不推荐,但是如果你非要这么写的话,请在写之前注明:

7 #<林海峰教的>

8 Choice = input(">>>")#获取用户输入的信息(模块名字)

9 __import__(Choice)#将用户输入的字符串变成模块的名字并导入模块

10 #

 

查看原文