Python 模块初始化的时候,发生了什么?
假设有一个 hello.py 的模块,当我们从别的模块调用 hello.py 的时候,会发生什么呢?
方便起见,我们之间在 hello.py 的目录下使用 ipython 导入了。
hello.py 的代码如下,分别有模块变量,函数,类变量,类的静态方法、类方法和实例方法。
# hello.py
print 'module value'
module_a = 233
def f():
print 'func name:', f.__name__
class DoClass(object):
print 'do class'
c_value = 88
@classmethod
def cf(cls):
print 'cf', cls.cf
@staticmethod
def sf():
print 'sf', DoClass.sf.func_name
def f(self):
print self.f
在 hello.py 的目录下,开启 ipython,查看结果。
In [1]: import sys
In [2]: sys.modules['hello']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-ec73143594c2> in <module>()
----> 1 sys.modules['hello']
KeyError: 'hello'
在还没有导入 hello 模块的时候,可以看到,此时系统中是没有这个模块的,让我们进行一次导入。
In [3]: import hello
module value
do class
In [4]: sys.modules['hello']
Out[4]: <module 'hello' from 'hello.pyc'>
导入后,可以看到模块中的模块变量和类变量都直接执行了,并且可以看到此时系统中是有了 hello 这个模块了。此时可以看一下 hello 模块的属性:
In [5]: dir(hello)
Out[5]:
['DoClass',
'__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'f',
'module_a']
可以看到,模块有模块变量、函数以及类三个属性。此时,在 ipython 中再次导入 hello,查看结果:
In [6]: import hello
In [7]:
发现此时什么都没有输出,这是因为模块只有第一次被导入的时候才会被执行。其实,可以把导入模块作为生成一个新的对象,模块变量和类变量都是在模块对象初始化的时候执行的,而函数和类的方法,则不会初始化的时候执行,只有在调用的时候才会执行:
In [7]: hello.f()
func name: f
In [8]: hello.module_a
Out[8]: 233
In [9]: hello.DoClass
Out[9]: hello.DoClass
In [10]: hello.DoClass.c_value
Out[10]: 88
那么,如果在你模块中导入了其他的模块,或者导入了其他模块的方法,又是怎样的呢?
# hello.py
# -*- coding: utf-8 -*-
import math
from math import sqrt
在模块中导入 math 以及 math 的 sqrt 方法,然后导入 hello:
In [1]: import hello
In [2]: dir(hello)
Out[2]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'math',
'sqrt']
In [3]: hello.math
Out[3]: <module 'math' from '/usr/local/Cellar/python/2.7.14_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/math.so'>
In [4]: hello.math.sqrt(100)
Out[4]: 10.0
In [5]: hello.sqrt(1000)
Out[5]: 31.622776601683793
可以看到,导入 hello 后,在 hello 中导入的 math 以及 sqrt 都成了 hello 的方法,这和我们直接在模块中定义的变量是一致的。
总结:不管在模块中导入其他的模块或者直接定义变量,函数以及类,挡在别的模块中导入该模块的时候,这些内容都将成为该模块的属性。这其实和 Python 中一切皆对象是保持一致的。
Python 模块初始化的时候,发生了什么?的更多相关文章
- python模块的作用和说明
Python模块 如果你从Python解释器退出并再次进入,之前的定义(函数和变量)都会丢失.因此,如果你想编写一个稍长些的程序,最好使用文本编辑器为解释器准备输入并将该文件作为输入运行.这被称作编写 ...
- Python模块 --- 最高级别程序组织单元
模块 --- 最高级别程序组织单元 <Python学习手册>笔记 import 导入1个模块 from 获取模块指定变量名 imp.reload 重新载入模块文件代码的方法 模块作用 代码 ...
- python模块、异常
1. python 模块 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用 python 标准库的方法.(有点像java的c ...
- 使用C/C++写Python模块
最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...
- Python模块之configpraser
Python模块之configpraser 一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...
- python 学习第五天,python模块
一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
- python 模块加载
python 模块加载 本文主要介绍python模块加载的过程. module的组成 所有的module都是由对象和对象之间的关系组成. type和object python中所有的东西都是对象,分为 ...
- C语言扩展Python模块
1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \ C/C++中调用python文件. #include ...
随机推荐
- sturts标签中
struts中的s标签中textfield和textarea中不需要加上value和中间值,通过name可以直接取到. textfield和textarea标签没有value属性,需要加上${ylqx ...
- 浅析HTTP/2的多路复用
HTTP/2有三大特性:头部压缩.Server Push.多路复用.前两个特性意思比较明确,也好理解,唯有多路复用不太好理解,尤其是和HTTP1.1进行对比的时候,这个问题我想了很长时间,也对比了很长 ...
- Spring|IOC启动流程
1.IOC启动流程 IOC的启动流程分为两个阶段,第一阶段是容器的启动阶段,第二阶段是Bean实例化阶段. 容器的启动阶段:加载配置信息,分析配置信息,其他 Bean实例化阶段:实例化对象,装配依赖, ...
- 第十二周助教工作总结——NWNU李泓毅
助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:基于原型的团队项目需求调研与分析:https://www.cnblogs.com/nwnu-daizh ...
- 小程序运行报错navigateTo:fail page "pages/warn/warn" is not found
在index.js中配置触发时页面转发 wx.navigateTo({ url: '../warn/warn', }) 实际上触发时报错页面找不到 原因是页面路径没有在app.json里面没有定义过, ...
- 027 H5常用标签
只记录一下比较有趣的知识点. 一:新标签 1.选项列表datalist <!DOCTYPE html> <html lang="en"> <head& ...
- System.Net.WebRequest.cs
ylbtech-System.Net.WebRequest.cs 发出对统一资源标识符(URI)的请求.这是一个 abstract 类. 1.返回顶部 1. #region 程序集 System, V ...
- Java程序员金三银四精心准备的面试题及答案(基础篇)
1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...
- Linux记录-mysql参数优化
1.参数优化show variables like ''/etc/my.cnf[mysqld]Max_connections =1024 #请求的最大连接数back_log =1024 #mysql能 ...
- vs2010 出错:error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏(转)
“LNK1123:转换到 COFF期间失败:文件无效或损坏”的解决方法 一.错误描述 之前写的程序隔段时间使用VS2010再次运行时出现如下错误: LINK fatal error LNK1123转换 ...