开篇

开门上代码:

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,后面将介绍它的用途。

关于如何导入包以及包里的模块等,和模块中的方法基本上是一样的,你只需要在前面再加上包名.就好了。

这就像剥洋葱一样,从最外层(包名)开始,一层一层深入(模块名,对象名)

来举个例子吧:

我将demozz模块存在mypackage文件夹下



Python 怎么引用同级目录中的文件中的方法 python同目录下如何导入_Python

然后在与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 *

之后,会惊讶的发现,并没有将demozz模块导入:

>>> 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并不是真正意义上的包。

这一点了解即可,大多数时候,我们都是在调用别人写好的包,因此掌握以上关于包和模块的导入以及调用方法就达到目的了。