Python 模块(十二)

首先申明下,本文为笔者学习《Python学习手册》的笔记,并加入笔者自己的理解和归纳总结。

1. 模块的创建

通常以.py结尾的文件会被认为是python的模块。
模块的名称会在导入时被使用,因此必须满足变量的命名规则。

自定义模块mymod.py文件

import sys

X = 11
Y = [1, 2]

def fun():                       # 方法fun,用来打印字符串
	print "Hello World"

class klass:
	pass

2. import、from导入模块

import导入一个模块。

>>> import mymod                 # import导入mymod模块
>>> mymod.X                      # 模块的属性
11

>>> mymod.fun()                  # 模块的函数
Hello World

from从一个模块中导入一个特定的变量名。

>>> from mymod import X          # 导入mymod模块属性
>>> X
11

>>> from mymod import fun        # 导入mymod模块函数
>>> fun()
Hello World

import只会加载一次。

>>> import mymod
>>> mymod.X = 13                 # 修改模块中X的值
>>> mymod.X
13

>>> import mymod                 # 再次调用import
>>> mymod.X                      # X的值未变化
13

3. imp.reload重新导入模块

修改模块变量的值,重新导入后,修改的变量恢复到默认值。

>>> import mymod
>>> mymod.X
11

>>> mymod.X = 13
>>> from imp import reload
>>> reload(mymod)
<module 'mymod' from 'E:\mymod.pyc'>

>>> mymod.X
11

修改模块代码,需要重新导入。
修改mymod.py文件中fun()方法,把打印字段改成"Welcome to Python"

>>> import mymod                 # 再次导入mymod模块
>>> mymod.fun()                  # 由于模块已导入,方法还是原来的
Hello World

>>> import imp
>>> imp.reload(mymod)            # 调用imp.reload方法,重新导入mymod模块
<module 'mymod' from 'E:\mymod.pyc'>

>>> mymod.fun()                  # fun方法已修改
Welcome to Python

4、导入模块搜索顺序

如果需要添加搜索目录,可以修改sys.path的值。
在D盘下存在extend.py文件

print "extend init"              # 打印一段字符串

该模块无法直接导入。

>>> import extend
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    import extend
ImportError: No module named extend

sys.path中添加目录

>>> import sys
>>> sys.path                     # 在sys.path中定义了模块目录,从左往右搜索
>>> sys.path.append("d:\\")
>>> import extend
extend init

5. 模块属性访问

在模块内的属性、方法和类等都可以看成模块的属性,通过逗号(.)访问。

>>> import mymod
>>> mymod.sys                    # 模块导入模块
<module 'sys' (built-in)>

>>> mymod.X                      # 模块内属性
11

>>> mymod.fun                    # 模块内的方法
<function fun at 0x0000000002CCDCF8>

>>> mymod.klass                  # 模块内的类
<class mymod.klass at 0x000000000291DCA8>

可以采用多种方式来访问模块属性。

>>> import mymod
>>> mymod.X                      # 逗号访问
11

>>> mymod.__dict__["X"]          # __dict__包含模块所有的属性
11

>>> getattr(mymod, "X")          # getattr函数
11

>>> import sys
>>> sys.modules["mymod"].X
11

importfrom都采用值传递的方法引用属性。

>>> import mymod                 # mymod是本地变量,指向mymod模块
>>> mymod.X = 13                 # 修改模块中X的值
>>> mymod.X
13

>>> from mymod import X          # X是本地变量,类似于X = mymod.X
>>> X = 15                       # X的值被修改
>>> mymod.X                      # 模块中X的值未变
13

>>> from mymod import Y          # Y是本地变量,指向mymod.Y
>>> Y[0] = 15                    # Y是列表,自身被修改
>>> mymod.Y
[15, 2]

6. 模块包

除了模块名,导入也可以指定目录路径,以点号(.)分开。
例如在当前目录下有一个dir1/dir2/mymod.py文件

dir1dir2目录下必须要有__init__.py文件。
dir1/__init__.py文件

print "dir1 init"
X = 11

dir1/dir2/__init__.py文件

print "dir2 init"
Y = 13

mymod.py文件

print "mymod init"

导入时以逗号分开。

>>> import dir1.dir2.mymod      # 导入dir1/dir2/mymod模块
dir1 init                       # dir1/__init__.py文件
dir2 init                       # dir1/dir2/__init__.py文件
mymod init                      # dir1/dir2/mymod.py文件

可以导入目录,对应各自的__init__.py文件。

>>> from imp import reload
>>> reload(dir1)                # 重新导入dir1
dir1 init
<module 'dir1' from 'E:\dir1\__init__.pyc'>

>>> reload(dir1.dir2)           # 重新导入dir2
dir2 init
<module 'dir1.dir2' from 'E:\dir1\dir2\__init__.pyc'>

>>> dir1.X, dir1.dir2.Y         # 访问__init__.py中的变量
(11, 13)

7. __name__内置属性

如果该模块是被执行的话,__name__被设置为"__main__",否则就是模块的名称。

minemod.py文件

def fun():
	print "Hello World!"
	
if __name__ == "__main__":
	fun()

外部调用

>>> import minemod
>>> minemod.fun()
Hello World!

在cmd命令下,直接运行该模块文件

% python mine.py
Hello World!

8. as可以制定一个变量名替代导入变量

>>> import dir1.dir2.mymod as mm           # 重命名导入进来的变量名
>>> mm.X
11

9. exec动态访问模块

使用一个变量定义一个模块,直接导入会发生异常。

>>> module = "dir1.dir2.mymod"
>>> import module
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import module
ImportError: No module named module

>>> exec("import " + module)
dir1 init
dir2 init
mymod init

相关文章
Python 数字类型(一)
Python 布尔型(二)
Python 字符串(三)
Python 列表(四)
Python 字典(五)
Python 元组(六)
Python 集合(七)
Python 变量和作用域(八)
Python 语句(九)
Python 函数(十)
Python 类(十一)
Python 模块(十二)
Python 文档(十三)
Python 文件(十四)
Python 异常(十五)
Python 运算符重载(十六)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值