您的位置:首页 > 编程语言 > Python开发

Python的动态加载机制

2014-05-23 21:56 260 查看
分类: python2013-03-25
23:23 380人阅读 评论(0) 收藏 举报

python动态加载延迟导入

众所周知import是用来加载Python模块的,其实import是调用内建函数__import__来工作的,这就使我们动态加载模块变成了可能。

[python] view
plaincopy

import glob, os

modules = []

for module_file in glob.glob('*-plugin.py'): #glob.glob得到当前目录下匹配字符串的文件名

module_name, ext = os.path.splitext(os.path.basename(module_file)) #将文件名以点号分开

print(os.path.basename(module_file))

print(ext)

module = __import__(module_name) #获得模块

fun = getattr(module, 'hello') #根据函数名获得函数

print(fun)

fun()

modules.append(module)

for module in modules:

module.hello()

下面我们来实现一个动态加载的类,当第一次使用该模块时,才会被加载

[python] view
plaincopy

class LazyImport:

def __init__(self, module_name):

self.module_name = module_name

self.module = None

def __getattr__(self, funcname):

if self.module is None:

self.module = __import__(self.module_name)

print(self.module)

return getattr(self.module, funcname)

string = LazyImport('string')

print(string.ascii_lowercase)

其中,这个类的__getattr__方法,只有当这个类的对象调用了某个方法,并且找不到这个方法的时候会被自动调用。

一般象a.b这样的形式,python可能会先查找a.__dict__中是否存在,如果不存在会在类的__dict__中去查找,再没找到可能会去按这种方法去父类中进行查找。实在是找不到,会调用__getattr__,如果不存在则返回一个异常。那么__getattr__只有当找不到某个属性的时候才会被调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: