博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python反射示例
阅读量:4170 次
发布时间:2019-05-26

本文共 2039 字,大约阅读时间需要 6 分钟。

本文用到的文件test.py,person.py,sqlserverhelper.py,mysqlhelper.py所在的工程如下图:

person.py文件内容:

class Person():    def __init__(self):        self.name='python'            def getName(self):        return self.name

1》未使用反射:

test.py文件内容:

from person import Personp=Person()print p.getName()
结果:

python

2》反射示例一:

test.py文件内容:

from person import Personp = globals()["Person"]()print getattr(p,'name')print getattr(p,'getName')()
结果:

python

python

3》反射示例二:(动态导入模块)

test.py文件内容:

module = __import__("person")p = getattr(module, "Person")()print hasattr(p,'name')print getattr(p,'name')print getattr(p,'getName')()
结果:
True
python
python
4》反射示例三:开发大型程序,期望能够随时切换数据库(动态导入)

sqlserverhelper.py文件内容:

#!/usr/bin/env python#coding:utf-8def count():    return 2name='sqlserverhelper'
mysqlhelper.py文件内容:

#!/usr/bin/env python#coding:utf-8def count():    return 1name='mysqlhelper'
test.py文件内容:
#!/usr/bin/env python#coding:utf-8temp='mysqlhelper'module=__import__(temp)#反射:以字符串的形式导入模块print module.count()   #正常调用count函数func='count' #反射:以字符串的形式执行函数f=getattr(module,func) #查找函数countprint f() print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')
运行test.py,结果:

1

1
False True <function count at 0x02937CB0>
False True mysqlhelper

若要切换到sqlserverhelper,仅需要修改一行,修改后的test.py如下:

temp='sqlserverhelper'#仅仅需要修改这一行module=__import__(temp)#反射:以字符串的形式导入模块print module.count()   #正常调用count函数func='count' #反射:以字符串的形式执行函数f=getattr(module,func) #查找函数countprint f() print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')
运行结果:
2
2
False True <function count at 0x02BC7CB0>
False True sqlserverhelper

另外:

delattr(module,'count')#删除属性
hasattr(module,'count')#判断属性是否存在

反射小结:

1》通过类名获得类的实例对象
2》通过方法名得到方法,实现调用
3》使用__import__方法导入模块之后,获得模块中的属性和方法使用getattr()方法
使用__import__只能导入文件(模块), 到class级别或函数级别或变量级别应该使用getattr。
获得类以后, 要创建实例对象, 在getattr()后再加上(),
不管属性和方法都使用getattr获得, 如果要调用方法, 使用getattr(xx,'method')()

友情链接:

你可能感兴趣的文章
Recover Deleted Linux Files With lsof
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 01 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 02 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 03 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 04 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 05 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 06 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 07 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 08 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 09 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 10 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 11 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 12 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 13 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 14 exercise
查看>>
<<Oracle Applications DBA 基础(第二期)>>Week 15 exercise
查看>>
更改Oracle JDeveloper的显示语言为英语
查看>>
vbs之CurrentDirectory
查看>>
跳过17:30,跳过瑞星定时扫描
查看>>
自动订饭
查看>>