假设有一个 hello.py 的模块,当我们从别的模块调用 hello.py 的时候,会发生什么呢?

方便起见,我们之间在 hello.py 的目录下使用 ipython 导入了。

hello.py 的代码如下,分别有模块变量,函数,类变量,类的静态方法、类方法和实例方法。

# hello.py
print 'module value'
module_a = 233def f():print 'func name:', f.__name__class DoClass(object):print 'do class'c_value = 88@classmethoddef cf(cls):print 'cf', cls.cf@staticmethoddef sf():print 'sf', DoClass.sf.func_namedef f(self):print self.f

在 hello.py 的目录下,开启 ipython,查看结果。

In [1]: import sysIn [2]: sys.modules['hello']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-ec73143594c2> in <module>()
----> 1 sys.modules['hello']KeyError: 'hello'

在还没有导入 hello 模块的时候,可以看到,此时系统中是没有这个模块的,让我们进行一次导入。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
In [3]: import hello
module value
do classIn [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 helloIn [7]:

发现此时什么都没有输出,这是因为模块只有第一次被导入的时候才会被执行。其实,可以把导入模块作为生成一个新的对象,模块变量和类变量都是在模块对象初始化的时候执行的,而函数和类的方法,则不会初始化的时候执行,只有在调用的时候才会执行:

In [7]: hello.f()
func name: fIn [8]: hello.module_a
Out[8]: 233In [9]: hello.DoClass
Out[9]: hello.DoClassIn [10]: hello.DoClass.c_value
Out[10]: 88

那么,如果在你模块中导入了其他的模块,或者导入了其他模块的方法,又是怎样的呢?

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# hello.py
# -*- coding: utf-8 -*-
import math
from math import sqrt

在模块中导入 math 以及 math 的 sqrt 方法,然后导入 hello:

In [1]: import helloIn [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.0In [5]: hello.sqrt(1000)
Out[5]: 31.622776601683793

可以看到,导入 hello 后,在 hello 中导入的 math 以及 sqrt 都成了 hello 的方法,这和我们直接在模块中定义的变量是一致的。

总结:不管在模块中导入其他的模块或者直接定义变量,函数以及类,挡在别的模块中导入该模块的时候,这些内容都将成为该模块的属性。这其实和 Python 中一切皆对象是保持一致的。

Python 模块初始化的时候,发生了什么?相关推荐

  1. python模块和类_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  2. python 模块和包

    模块和包: 1.如何自己写一个模块 import 模块名 模块的导入相当于这个模块所在的文件,模块的多次导入不会重复执行 命名空间 为模块起别名 as 语句 一行导入多个模块 : 内置 第三方 自定义 ...

  3. python模块和类和方法_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  4. python模块学习笔记

    python模块学习笔记 1.Python自动发送邮件smtplib 2.制作二维码图片MyQR 3.绝对值模块math 4.CSV模块 5.openpyxl 模块,操作Excel文件 ExcelMa ...

  5. Python模块之二:Python3 常用模块总结

    Python模块之二:Python3 常用模块总结 一.random模块 提供一些随机数获取的相关方法 1.常用方法 1.random():获取[0.0,1.0)范围内的浮点数 2.randint(a ...

  6. Python 模块大全(很详细!)

    转载:.... Python的模块大全,很全,有详细介绍! 另外附Python两个教程 1. Python详细教程(廖雪峰的官方网站,语言简洁!) 2. Python 进阶教程 (Vamei) 3. ...

  7. Python模块与类

    2019独角兽企业重金招聘Python工程师标准>>> 类 类的定义,继承 类中的属性,类属性和实例属性的区别及访问方式 变量名以"_"或"__&quo ...

  8. python常用模块大全总结-常用python模块

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. python常用模块什么是模块? 常见的场景:一个模块就是一个包含了py ...

  9. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

最新文章

  1. 团队冲刺站立会议07
  2. TF之LiR:基于tensorflow实现机器学习之线性回归算法
  3. Selenium 功能总结大集合
  4. 成员变量和类变量的区别:
  5. SVN代码回滚命令之---svn up ./ -r 版本号---OK
  6. Openresty 学习笔记(一)opm 工具的使用
  7. 任正非:华为留不住人才是我的痛!
  8. java列举生活中类和对象_趣味解读Python面向对象编程 (类和对象)
  9. 那些移动端web踩过的坑2
  10. Vss2005 的使用方法
  11. DT时代的“数据安全”
  12. MyEclipse 10 注册码 破解 到期限制
  13. python代码实现时间从12小时制到24小时制的转换
  14. Linux常用操作和命令
  15. HTML5 video/audio监听事件属性及方法
  16. Mac下独立设置触控板和鼠标的滚动方向
  17. 怎么将wav转换成mp3
  18. 如何关闭苹果笔记本win8系统下的触摸板
  19. 元学习之模型无关的元学习
  20. 初中计算机教学校本教材,中学信息技术校本教材  (38页)-原创力文档

热门文章

  1. MSDN、RTM、OEM、VOL四大版本之区别
  2. PHP 表单和用户输入
  3. SharePoint 2013常用开发工具分享
  4. 在linux下php挂接mysql.so扩展的方法
  5. C核心技术手册(五)
  6. linux tac sed,Day08 - 一些常用 Linux 指令 - 3-7 (cat、tac、head、tail、vi、sed)
  7. 【转】排除被冲销的物料凭证
  8. 传统BI为什么注定会失败?
  9. SAP一句话入门:Human Resource
  10. SAP CRM市场营销表结构