python反射机制

本文总结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 str
Traceback (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
>>> 

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值