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__只有当找不到某个属性的时候才会被调用。
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__只有当找不到某个属性的时候才会被调用。
相关文章推荐
- python的动态加载机制??
- Python模块的动态加载机制
- Python中模块的动态加载机制
- Python的动态加载机制
- Python模块的动态加载机制
- Python模块的动态加载机制
- Python模块的动态加载机制
- Android中的动态加载机制
- python - 动态加载模块和类
- Ext JS 4的倒数:动态加载和新的类机制 Count down to Ext JS 4: Dynamic Loading and New Class System (下)
- Python的动态绑定与赋值机制
- 深入学习Django源码基础4 - python的动态延时加载技术(lazy)
- python 动态加载类,类似java的class.forName
- Ext JS 4:动态加载和新的类机制(Dynamic Loading and New Class System)
- 后退的页面加载机制与动态html的影响
- python - 动态加载模块和类
- 动态重新加载Class机制之代码测试
- Ext JS 4的倒数:动态加载和新的类机制 Count down to Ext JS 4: Dynamic Loading and New Class System (下)
- 浅析各种动态加载机制
- 突破 Silverlight 自身限制, 做更好的动态加载导航机制(一)