笔记-python-module导入技巧

 笔记-python-module导入技巧

1.      module导入技巧

1.1.    控制模块导入内容

在模块中定义

__all__ = []

不多言,主要是影响from <> import *

1.2.    延迟导入

作为这一章节的延伸,将介绍延迟导入。如图所示,__init__.py文件一次导入所有必需的组件的。但是对于一个很大的模块,可能你只想组件在需要时被加载。 要做到这一点,__init__.py有细微的变化:

# __init__.py

def A():

    from .a import A

    return A()

扫描二维码关注公众号,回复: 5429659 查看本文章

def B():

    from .b import B

    return B()

在这个版本中,类A和类B被替换为在第一次访问时加载所需的类的函数。对于用户,这看起来不会有太大的不同。 例如:

>>> import mymodule

>>> a = mymodule.A()

>>> a.spam()

A.spam

>>> 

延迟加载的主要缺点是继承和类型检查可能会中断。需要稍微改变代码,例如:

if isinstance(x, mymodule.A): # Error

...

if isinstance(x, mymodule.a.A): # Ok

...

1.3.    重新加载模块

有时需要重新加载模块

import imp

imp.reload(mo_test)

它实质是重新编译文件并将变量指向编译后的文件,因为变量指向更新了,在同一进程中的不同线程看来这一变动是共享的,在不同进程中则不然,除非重启进程。

需要注意的是如果其它语句使用from import 格式从同一模块中导入了变量,reload并不会同时更新它,

它也不会重新执行__init__.py中的导入语句,所以如非必要,不要使用它。

>>> from mo_test.mo_test2 import k

>>> k

45

# k值改为56; k = 56

>>> imp.reload(mo_test2)

<module 'mo_test.mo_test2' from 'E:\\python\\code test\\mo_test\\mo_test2\\__init__.py'>

>>> k

45

>>> mo_test.mo_test2.k

56

参考文档:https://docs.python.org/3/library/imp.html

1.4.    动态引入模块

importlib支持传入字符串来引入一个模块。

import importlib

mo_test = importlib.import_module('mo_test')

# 注意返回的是一个模块对象,所以需要声明一下变量,否则会在命名空间中找不到模块变量。

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/10480518.html