python反射机制

来源:互联网 发布:java定时器 任务超时 编辑:程序博客网 时间:2024/04/30 09:13

本文总结python的反射机制,以及其简单应用

首先要说的是globals()函数
在没有任何模块导入的情况下,执行globals函数,函数返回的是一个包含当前作用域的全局变量的字典,key是全局范围内对象的名字。

>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

然后先导入一个模块(os),在执行globals函数

>>> import os>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'os': <module 'os' from '/usr/local/lib/python2.7/os.pyc'>, '__doc__': None, '__package__': None}

可以发现在返回的字典中, 多了os模块以及其path

如果导入类,在返回字典中也可以找到类。

>>> import sys>>> from sys import getsizeof>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, 'getsizeof': <built-in function getsizeof>, '__name__': '__main__', 'os': <module 'os' from '/usr/local/lib/python2.7/os.pyc'>, '__doc__': None}

*题外话:
推荐使用help()查看函数使用方法和介绍。对于初学者来说help()比较使用,不仅可以查看函数用法,还可以直接查模块的信息*

接下来关于globals的几个简单应用:
因为globals返回的是字典,可以利用key得到模块或者类

>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'sys': <module 'sys' (built-in)>, 'getsizeof': <built-in function getsizeof>, 'tab': <module 'tab' from '/usr/local/lib/python2.7/tab.pyc'>, '__name__': '__main__', 'os': <module 'os' from '/usr/local/lib/python2.7/os.pyc'>, '__doc__': None}>>> globals()['getsizeof']<built-in function getsizeof>>>> 

所以如果你想实例化一个对象:

>>> ok  = globals()['getsizeof']>>> ok<built-in function getsizeof>>>> 

这样的方法有一定的局限性,要在globals函数之前导入相应的类,如果不导入,则globals函数返回的字典中就不存在关于这个类的信息,就会出现异常。

所以介绍一种动态导入的方法:
__import__函数出现了。。。。。。。
我认为__import__() 函数就像一个转换器一样,相当于一个翻译官。还是先看例子:
现在有一个字符串 str = 'sys', 如果我想用字符串的而形式导入怎么实现? import str ????? 肯定是不可以的。

首先可以从globals函数返回字典中,看出还未导入任何模块

>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}

然后尝试利用字符串形式导入sys模块,很明显是不可以的。这是因为python只知道str是储存字符串的变量。

>>> str = 'sys'>>> import strTraceback (most recent call last):  File "<stdin>", line 1, in <module>ImportError: No module named str

下面就是关于import 的用法

>>> module = __import__(str)>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, 'module': <module 'sys' (built-in)>, '__package__': None, 'str': 'sys', '__name__': '__main__', '__doc__': None}>>> 

还可以直接以字符串形式导入module = __import__('re')

最后结合getattr()函数,用来导入模块,并调用其类和方法
getattr,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例
来个例子:

>>> module = __import__('string')>>> func = getattr(module,'split')>>> 

globals验证一下

>>> globals(){'__builtins__': <module '__builtin__' (built-in)>, 'module': <module 'string' from '/usr/local/lib/python2.7/string.pyc'>, '__package__': None, 'func': <function split at 0x7fd71bdeab90>, '__name__': '__main__', '__doc__': None}>>> 

补充一下callable函数,如果传入的参数是可以调用的函数,则返回true,否则返回false。

>>> callable(getattr(module,'split'))True>>> callable(getattr(module,'__doc__'))False>>> 

例子简单很好理解,可能会觉得并没有看出这个反射机制并没有多么牛。。。。。。。我也。。。。。。

代码是慢慢积累出来的,一点点弄清楚,才能写出更优秀的代码,共勉!!!

0 0
原创粉丝点击