开篇
开门上代码:
import random
import pandas as pd
from pandas import *
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
...
emm…
你也许已经知道,这些代码语句是为了导入别人写好的代码文件,以供自己调用
你可能也听说过"包"和"模块"这些概念
没有也不要紧~
今天,我们就来简要介绍下Python
中的包和模块,以及各种导入和调用包和模块
的方法。
(以下操作均使用IDLE
)
模块
你所写的每一个.py
文件,其实都是一个单独的模块
现在,将以下代码复制到你的.py
文件中,起名为demo
,你就拥有了一个叫做demo.py
的模块
m='南极冷不冷了'
def add(a,b):
print(a+b)
class BlackDog():
color='black'
def __init__(self,name):
=name
def run(self):
print('正在跑...')
接下来我们将使用该模块演示各种import
的使用大法:
现在,请你新建一个test.py
文件,为了便于演示,请和上面的demo.py
文件放到同一路径下
import xxx
在test.py
中输入
import demo
运行之后,不会报错,说明已经成功导入
我们可以在IDLE
的命令行输入demo
来查看:
>>> demo
'demo' from 'C:\\Users\\fanxi\\Desktop\\demo.py'>
这样,我们就导入了整个demo
模块
你可以使用.
操作来选取你所需要的对象(变量,函数,类):
#调用demo模块中的变量
>>> demo.m
'南极冷不冷了'
#查看demo模块中的函数
>>> demo.add
0x00000299E512F318>#调用demo模块中的函数
>>> demo.add(1,2)3#调用demo模块中的类,生成实例化对象mydog
>>> mydog=demo.BlackDog('旺财')#实例化出来的对象#可以正常调用其属性和方法
>>> mydog.color'black'
>>> mydog.name'旺财'
>>> mydog.run()
正在跑...
这里,我们的模块名是demo
,只有四个字母。而有时候一个模块的名字是很长的,本着能偷懒就偷懒的原则,我们不愿意每次都写那么长的模块名,于是有了下面的做法:
import demo as d
这句代码的作用是导入了demo
模块,并给整个模块重新起了个名字,叫做d
之后,你想调用demo
模块中的某个对象,比如add
函数时,就可以写d.add()
。
>>> import demo as d
>>> d.add(1,2)
3
上面的这种方法,是通过模块名.xxx
来调用模块中的函数、变量等,如果你不想使用.
,而是直接使用特定的对象(函数,变量,类等),那么你可以使用下面的两种方法:
from xxx import yyy
现在我只需要用到demo
模块中的add
函数,那么完全没有必要导入整个模块,可以这样写:
from demo import add
这样,就可以直接使用add
函数了:
>>> add(1,2)
3
此时,若想使用demo
模块中的m
变量,由于还没有导入m
,因此会报错:
>>> m
Traceback (most recent call last):
File "", line 1, in
m
NameError: name 'm' is not defined
以上是从模块中导入特定对象的方法
如果想要一次导入模块中的全部对象,可以这样写:
from demo import *
此时,你可以随意使用demo
模块中的全部对象:
>>> m
'南极冷不冷了'
>>> add(1,3)
4
>>> mydog2=BlackDog('汪汪')
>>> mydog2.run()
正在跑...
当然,你也可以给调用的对象重新起名:
>>> from demo import add as a
>>> a(1,2)
3
包
你已经了解了关于模块的调用方法,再来学习包的概念也就不难了
在Python
中,包是包含了若干模块的集合,也就是说,若干模块可以组成一个包。
举个例子,假设你已经写好了许多个模块文件,并且将它们放在了一个叫做mypackage
的文件夹里面,这就差不多是一个包了。
之所以说差不多,是因为在Python
的包中,还包含了一个特殊的模块文件,叫做__init__.py
,后面将介绍它的用途。
关于如何导入包以及包里的模块等,和模块中的方法基本上是一样的,你只需要在前面再加上包名.
就好了。
这就像剥洋葱一样,从最外层(包名)开始,一层一层深入(模块名,对象名)
来举个例子吧:
我将demo
和zz
模块存在mypackage
文件夹下
然后在与mypackage
同一路径下新建py
文件,输入以下代码进行测试:
#导入整个包
import mypackage
#导入整个包并起个别名叫做pck
import mypackage as pck
#从包中只导入demo模块并起个别名叫做d
from mypackage import demo as d
#导入demo模块中的全部对象
from mypackage.demo import *
以上代码均能正常执行
但是当你运行
from mypackage import *
之后,会惊讶的发现,并没有将demo
和zz
模块导入:
>>> demo
Traceback (most recent call last):
File "", line 1, in
demo
NameError: name 'demo' is not defined
>>> zz
Traceback (most recent call last):
File "", line 1, in
zz
NameError: name 'zz' is not defined
这是因为你的包中没有__init__
模块
之前说过,在Python
的包中,包含了一个特殊的模块文件,叫做__init__.py
。
它的用途在于:规定在执行from 包名 import *
时,查找可以被导入的模块名。也就是说,只有你的模块名被写入__init__.py
中,才能被from 包名 import *
这句代码导入,否则需改换其他导入语句。
所以,以上的mypackage
并不是真正意义上的包。
这一点了解即可,大多数时候,我们都是在调用别人写好的包,因此掌握以上关于包和模块的导入以及调用方法就达到目的了。