016-1 模块-模块的加载顺序、导入执行流程

1、模块的加载顺序:内存=》内置=》sys.path

import sys
sys,path      #环境变量:存放文件路径的列表
# 重点:默认列表的第一个元素就是当前被执行的问建所在的目录

# 可以自定义往sys.path添加路径
sys.path.append(r‘想导入的模块的绝对路径‘)  # 添加到环境变量最后,最后被查找
sys.path.insert(0, r‘想导入的模块的绝对路径‘)  # 添加到指定索引,索引就决定了自定义模块的查找顺序

2、模块的导入执行流程

导入模块的指令:

--相对于 函数()调用函数体,函数调用会进入函数体,从上至下逐句解释执行函数体代码
--导入模块,会进入模块文件从上至下逐句执行模块的文件的代码
--如果在模块中有遇到其他模块,会接着进入导入的模块,从上至下逐句解释执行文件中代码,依次类推

3 循环导入

模块之间出现了环状导入,如:m1.py 中导入了m2,m2.py 中又导入了m1

循环导入的问题:

①导入模块是要使用模块中的变量的

②正常的逻辑都是在文件的最上方先完成对模块的导入,在定义自身模块,以及使用导入的模块中的变量、
③由于导入模块的特殊机制,第一次导入模块会编译执行,导入的模块,也就是会进入模块逐句执行内容,再次导入使用内存中的名字
④就会出现下面的情况,m2在使用m1中的变量x,但变量x却并未产生,这就出现了循环导入问题

m1.py文件
import m2
x = 10
print(m2.y)

m2.py文件
import m1
y = 10
print(m2.x)

解决循环导入的问题:延后导入
1、将循环导入对应包要使用的变量提前定义,再导入响应的包
2、将导包的路径放到函数体中,保证存放导包逻辑的函数调用在要使用的变量定义之后

重点:
问题:from导包极容易出现循环导入问题
解决:建议from导入方式改用import导入方式

原文地址:https://www.cnblogs.com/king-home/p/10780247.html

时间: 2024-10-10 02:16:13

016-1 模块-模块的加载顺序、导入执行流程的相关文章

html、css、js文件加载顺序及执行情况

今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件. 3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件. 4. 浏览器继续载入html中&

【转】html、css、js文件加载顺序及执行情况

原链接:http://www.cnblogs.com/Walker-lyl/p/5262075.html 今天看书,看到html,css,js加载执行情况,发现自己并不是真正的了解,网上搜了半小时依然未弄明白,就在这时我找到了让我恍然大悟的一段话,如下: HTML页面加载和解析流程  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件.  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部

类中各模块的加载顺序

一.引言 说实话,此部分知识是在当初学C#基础的时候学到的,起初就记得有这么回事,后来学Java的时候对于基础跳过去很多,最近项目上遇到了一个问题,最终问题当然解决了,解决后想到了类中各模块加载顺序这个知识点,当结果与理论此时相互印证一番后,对此知识豁然开朗,也更清晰. 二.问题由来 一个类Test交给Spring进行管理,但是此类通过XML的形式进行配置的,在Test类中利用@Autowired注入了使用@Service注解的Call,private Call call,我在Test类的构造函

《python解释器源码剖析》第15章--python模块的动态加载机制

15.0 序 在之前的章节中,我们考察的东西都是局限在一个模块(在python中就是module)内.然而现实中,程序不可能只有一个模块,更多情况下一个程序会有多个模块,而模块之间存在着引用和交互,这些引用和交互也是程序的一个重要的组成部分.本章剖析的就是在python中,一个模块是如何加载.并引用另一个模块的功能的.对于一个模块,肯定要先从硬盘加载到内存. 15.1 import前奏曲 我们以一个简单的import为序幕 # a.py import sys 1 0 LOAD_CONST 0 (

(六)使用angular.bootstrap完成模块的手动加载

之前我们看到使用ng-app指令,可以实现模块的自动加载.现在我们看下,angular中如何手动加载模块.需要使用到angular.bootstrap这个函数. <html> <head> <script src="angular.js"></script> <script> // 创建moudle1 var rootMoudle = angular.module('moudle1', []); rootMoudle.cont

使用angular.bootstrap() 完成模块的手动加载

之前我们看到使用ng-app指令,可以实现模块的自动加载.现在我们看下,angular中如何手动加载模块.需要使用到angular.bootstrap这个函数. <html> <head> <script src="angular.js"></script> <script> // 创建moudle1 var rootMoudle = angular.module('moudle1', []); rootMoudle.cont

解决办法:mysql_connect()不支持请检查mysql模块是否正确加载

故障现象:linux 安装discuz 错误提示:mysql_connect() 不支持请检查mysql模块是否正确加载. 解决办法:查看/usr/lib/php/modules/ (64位的看/usr/lib64/php/modules/)里面根本没有mysql.so 找到centos5.4安装盘,放入光驱,然后找到CentOS目录下的 php-mysql-5.1.6-20.el5.i386.rpm php-pdo-5.1.6-20.el5.i386.rpm 二个文件,然后通过FTP上传到服务

模块“XXX.dll”加载失败

具体问题:模块“XXX.dll”加载失败 请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的.DLL文件是否有问题  找不到指定的模块. 1.在安装C++软件的时候,有时候安装失败提示“请确保二进制储存在指定的路径中,或者调试他以检查该二进制或相关的DLL文件”,这个应该是自己的电脑没有安装VC运行库,可以去微软下载安装. 2.还有以下方法. 解决win7运行批处理出错不能注册dll等问题 引用: http://blog.csdn.net/nxeexn/article/detai

centos7 解决 mysql_connect()不支持请检查mysql模块是否正确加载

故障现象:linux 安装discuz 错误提示:mysql_connect() 不支持请检查mysql模块是否正确加载.解决办法:查看/usr/lib/php/modules/ (64位的看/usr/lib64/php/modules/)里面根本没有mysql.so找到centos7安装盘,放入光驱,然后找到CentOS目录下的php-mysql-5.4.16-45.el7.x86_64.rpmphp-pdo-5.4.16-45.el7.x86_64.rpm 二个文件,然后通过FTP上传到服务