python的模块和包的详细说明
python
⼀、模块
相信使⽤过Python编写代码的同学,会经常在⽂件头看到这样的import …,是的,这就是导⼊模块的语句,⽽每⼀个后缀名为.py的⽂件都是⼀个模块。
import jieba
import os 
1. 什么是模块?
  逻辑上来说模块是⼀组功能的组合;实质上⼀个模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块名字加上.py的后缀。import加载的模块分为四个通⽤类别:
a. 使⽤python编写的代码(.py⽂件);
b. 已被编译为共享库或DLL的C或C++扩展;
c. 包好⼀组模块的包
d. 使⽤C编写并链接到python解释器的内置模块;
如何使⽤模块?
  想要使⽤模块,必须先要将模块加载进来,可以通过关键字 import 或 from进⾏加载;需要注意的是模块和当前⽂件在不同的命名空间中。
2. 模块的构成:
  模块可以包含可执⾏的语句和函数的定义,这些语句的⽬的是初始化模块,它们只在模块名第⼀次遇到导⼊import语句时才执⾏(import语句是可以在程序中的任意位置使⽤的,且针对同⼀个模块很import多次,为了防⽌你重复导⼊,python的优化⼿段是:第⼀次导⼊后就将模块名加载到内存了,后续的import语句仅是对已经加载⼤内存中的模块对象增加了⼀次引⽤,不会重新执⾏模块内的语句)
⼆、模块的导⼊
1、导⼊整个模块
  ⽐如我们有⼀个myModule的⽂件夹,⾥⾯有⼀个first.py⽂件,⽂件中的内容如下
a =1
def myfun(s):
print(s +1)
  在myModule的⽂件夹下打开终端/cmd,输⼊python进⼊命令⾏交互模式
写完模块导⼊的语句之后,接着就可以调⽤该模块下的函数了。调⽤⽅式为
>>>import first
>>> a
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
NameError: name 'a'is not defined
>>> first.a
1
>>> fun(2)
3
2、导⼊特定的函数/变量
  所以说first.py⽂件就是⼀个模块,可以⽤import导⼊,⾥⾯变量和⽅法都要⽤first.前缀来引⽤,如果想不使⽤这个前缀或是我们只是想要使⽤模块中的某个函数,就可以只导⼊该变量或函数。导⼊⽅式为:from module_name import function_name。
  如果导⼊的是变量,就可以直接输⼊变量名来获得变量的值;如果直接导⼊的是函数,可以直接使⽤function_name() 的⽅式调⽤函数,⽆需在函数名前⾯加上模块名。
# 导⼊变量
>>>from first import a
>>> a
1
# 导⼊函数
>>>from first import myfun
>>> myfun(3)
4
# ⼀次导⼊多个变量
>>>from first import a,myfun
>>> a
1
>>> myfun(5)
6
# 导⼊模块中全部变量
>>>from first import*
>>> a
1
>>> myfun(5)
6
>>>
3、使⽤as给模块指定别名
  可以在后⾯使⽤as给函数指定别名。句式如:import module_name as new_name,
>>>import first as f
>>> f.a
1
>>> f.myfun(6)
7
在上述导⼊函数的基础上,可以在后⾯⽤as语句给导⼊的函数指定别名。句式如:from module_name import function_name as
new_function。
>>>from first import myfun as add
>>> add(8)
9
三、模块、包、库的区别
模块(module) 其实就是py⽂件,⾥⾯定义了⼀些函数、类、变量等。
包(package) 是多个模块的聚合体形成的⽂件夹,⾥⾯可以是多个py⽂件,也可以嵌套⽂件夹。
库是参考其他编程语⾔的说法,是指完成⼀定功能的代码集合,在python中的形式就是模块和包。
四、包的导⼊
导⼊包的本质:导⼊⼀个包就是执⾏包下的__init__.py⽂件
只要⼀个⽂件夹下⾯有个 init.py ⽂件,那么这个⽂件夹就可以看做是⼀个包。
包导⼊的过程和模块的基本⼀致,只是导⼊包的时候会执⾏此包⽬录下的 init.py ⽽不是模块⾥⾯的语句了。另外,如果只是单纯的导⼊包,⽽包的 init.py 中⼜没有明确的其他初始化操作,那么此包下⾯的模块是不会⾃动导⼊的。
下⾯我们来实操进⾏说明
在myModule⽂件夹中新建folder⽂件夹,先cd进⼊myModule⽂件夹,在mkdir folder新建folder⽂件夹
xws@MHQ0063 myModule % mkdir folder
我们想让folder⽂件夹成为⼀个包。⽂件夹⾥新建abcd.py⽂件,输⼊vi abcd.py,⽂件中内容如下
b =2
class Myclass:
def__init__(self, name, age):
self.name = name
self.age = age
def get_info(self):
print('my name is {name} and age is {age}'.format(name = self.name, age = self.age))
esc–>:wq退出保存
此时在folder⽂件夹中新建⼀个__init__.py⽂件,否则程序会将这个⽂件夹当成普通⽂件夹来处理⽽不是⼀个包。这个__init__.py⽂件中可以什么都不填。
上⾯步骤操作下来,⽂件结构如下
我们还是在myModule⽂件夹下打开命令⾏,进⼊python交互模式
>>>import folder
>>> folder.abcd.b
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
AttributeError:'module'object has no attribute 'abcd'
# 只是导⼊包不能随便使⽤其中的模块,要导⼊到具体模块或者变量的层次
>>>from folder import abcd
>>> bob = abcd.Myclass(name ='Bob', age =20)
>>> bob.name
'Bob'
>>> _info()
my name is Bob and age is20
>>>from folder.abcd import b
>>> b
2
>>>import folder.abcd
>>> abcd.b
2
>>>import folder.abcd as a
>>> a.b
2
注意:
只是导⼊包不能随便使⽤其中的模块,要导⼊到具体模块或者变量的层次
⽂件夹与⽂件之间可以⽤.也可以⽤from import格式,⽽⽂件与⾥⾯的变量之间只能⽤from import格式,即不能import
folder.abcd.b
特殊的__init__.py⽂件
init.py⽂件其实是⼀个特殊的⽂件,它相当于名为folder模块,即如果使⽤import folder则可以调⽤在__init__.py⽂件⽂件中定义的变量。
将__init__.py⽂件编写如下
from folder.abcd import b
c =3
在myModule⽂件夹下打开命令⾏,进⼊python交互模式
>>>import folder
>>> folder.c
3
>>> folder.b
2
>>>from folder import b
>>> b
2
对⽐之前的from folder.abcd import b,使⽤__init__.py⽂件可以将常⽤的⼀些变量导⼊以⽅便调⽤。
另外需要注意两点
1. __ init__ .py⽂件编写时,如果要导⼊其他模块中的变量,即使__ init__.py⽂件和abcd.py⽂件在同⼀个⽂件夹下,也不能from abcd
import b,要从abcd⽂件从哪⾥来开始写,即从包的名称开始,from folder.abcd import b。
2. folder⽂件夹⾥的嵌套⽂件夹内不需要新建__init__.py⽂件即可像模块⼀样调⽤,但是⼀般还是要新建这个⽂件,可以⽅便地导⼊常
⽤变量。
⽤import hello时,python会搜寻hello.py⽂件,搜索顺序如下
import语句先搜寻内置模块是否有hello(因此我们定义的模块名不能内置模块相同)
若内置模块没有,则看以下这些⽬录⾥有没有
>>>import sys
>>> sys.path
['','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 .7','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin','/System/Library/Frameworks/Python.framework/Versions/2.7/li b/python2.7/plat-mac','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages','/System/Library/Framewor ks/Python.framework/Versions/2.7/lib/python2.7/lib-tk','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old','/System/Library/ Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload','/Users/xws/Library/Python/2.7/lib/python/site-packages']
其中第⼀个’‘表⽰当前的⼯作路径,我们可以看出安装的第三⽅包所在路径(‘/Users/xws/Library/Python/2.7/lib/python/site-packages’)也在这个列表之中,所以⽆论⼯作路径在哪⾥,都能搜寻到这些包。建议把模块放在该⽂件夹下。
__ all __
import *的⽅式⽆法导⼊以下划线开头的变量名_e = 4
__ init__.py⽂件内容更改如下
from folder.abcd import b
c =3
_e =4
python模式下,以下导⼊⽅式,在查变量_e是会报name ‘_e’ is not defined
>>>from folder import*
>>> c
3
>>> _e
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
NameError: name '_e'is not defined
但如果指定导⼊_e便可以
>>>from folder import c
>>> c
3
>>>from folder import _e
>>> _e
4
如果定义了__all__,则import *就可以导⼊下划线开头的变量
__ init__.py⽂件内容更改如下
from folder.abcd import b
__all__ =['c','_e']
c = b +1
_e =4

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。