Python易学就会(二)import的用法

  前文有叙,Python是开放型社群化的开发语言,因此咱们在编写Python程序时,不可避免的须要用到别人已经作好的、成型的类库,这些类库多是图形处理、多是网络通信、多是数据分析等等,反正不须要本身来从新从最底层开始再写一遍,这样就须要用到import 来引入外来的拓展包。
  可否找到更多的第三方库、拓展包,也所以成为评判一个编程语言的开发社区是否活跃、是否易用的一个标志。因此,学会用好import就成为咱们学习Python须要重点了解的第一个内容。
  Python能经过import 引入的,有模块(module)和包(package)两种。
  模块(module)的做用,就是能够把一组相关的功能,集成在一个 .py 文件中,方便在其它应用中经过 import 引入来调用。好比跟时间相关的操做,都集成在一个 module 中,使用时这样来操做。编程

#引入time模块
import time
#调用time模块的sleep()方法
time.sleep(1)

  不一样人写的模块(module)有可能会重名,例如A写了个time.py模块,B也写了个time.py,他们中间各有一个方法很是好用,对于C来讲,就容易混淆了。所以有了包(package)的概念。
  包(package)是在module的外面加了一层,如网络

#引入A的time模块
import A.time
#引入B的time模块
import B.time
#调用A的time模块的sleep()方法
A.time.sleep(1)
#调用B的time模块的方法
B.time.setTime(0)

  就至关于JAVA中的PACKAGE。物理上体如今:模块(module)能够放在同一目录下,而包(package)通常放在以包名命名的文件夹中。下面以例子来解释。编程语言

  新建 lmModule.py,内容以下学习

print("From lmModule.py")

  运行一下,能够看到正常打印测试

From lmModule.py

  在同一目录中再新建一个main01.py,内容以下code

import lmModule

print("From main01.py")

  运行一下,能够看到打印出来:开发

From lmModule.py
From main01.py

  因而可知,import其实是把要导入的程序预先加载在了主程序的前部,二者的内容都获得了执行。数据分析

  修改一下lmModule.py的内容,添加一个变量和一个方法:it

print("From lmModule.py")

lmModule_var = "LmModule Var"

def lmModule_method():
    print("From lmModule.py lmModule_method")

  再修改一下main01.py,来尝试调用一下模块的变量和方法:社区

import lmModule

print("From main01.py")

print(lmModule.lmModule_var)

lmModule.lmModule_method()

  运行发现,使用“模块名+.”的方式,能够很好的实现调用,运行结果以下:

From lmModule.py
From main01.py
LmModule Var
From lmModule.py lmModule_method

  再次修改main01.py,尝试不一样的import方法:

from lmModule import lmModule_var, lmModule_method

print("From main01.py")

print(lmModule_var)

lmModule_method()

  用“from 模块名 import 部分变量或方法”这种方式,能够从模块中引入特定的的变量或方法,这些变量或方法能够直接使用,就像程序本身定义的同样,再不须要用“模块名+.”来访问。若是须要引入全部的变量或方法,能够改写成通配符*,执行效果同样。

from lmModule import *

print("From main01.py")

print(lmModule_var)

lmModule_method()

  接下来,新建一个目录dir,在dir下面新建一个“dirModule.py”,内容以下:

print("From dir dirModule")

  修改main01.py,内容以下,以引入dir目录下的dirModule模块:

from lmModule import *

from dir.dirModule import *

print("From main01.py")

print(lmModule_var)

lmModule_method()

  执行发现,把模块定义在下级目录中,也是能够顺利import到的,执行效果以下

From lmModule.py
From dir dirModule
From main01.py
LmModule Var
From lmModule.py lmModule_method

  修改dirModule.py,在其中加入一个变量和一个方法的定义,内容以下:

print("From dir dirModule")

lmModule_var = "DirModule Var"

def lmModule_method():
    print("From dir dirModule.py lmModule_method")

  执行main01.py,能够看到,当前后import的两个模块中,有相同的变量定义或方法定义时,前面先import的会被后import的覆盖,执行效果以下:

From lmModule.py
From dir dirModule
From main01.py
DirModule Var
From dir dirModule.py lmModule_method

  若是修改main01.py,交换import的顺序,能够看到,执行的结果不一样,先import的会被后import的覆盖,你能够本身试试。

  为避免这种相互覆盖而出错的状况,import 时仍是尽可能使用“模块名+.”的方式来访问,固然能够用别名。修改main01.py以下:

import dir.dirModule as d

import lmModule as h

print("From main01.py")

print(h.lmModule_var)

d.lmModule_method()

  执行效果以下:

From dir dirModule
From lmModule.py
From main01.py
LmModule Var
From dir dirModule.py lmModule_method

  在dir目录下新建一个“secModule.py"文件,内容以下:

print("From dir secModule")

secModule_var = "SecModule Var"

  修改main01.py,增长对于secModule模块的调用,内容以下:

import dir.dirModule as d
import dir.secModule
import lmModule as h

print("From main01.py")

print(h.lmModule_var)

d.lmModule_method()

print(dir.secModule.secModule_var)

  执行一下,能够看到secModule模块的内容正常被引入了,secModule模块中定义的变量也可使用。

From dir dirModule
From dir secModule
From lmModule.py
From main01.py
LmModule Var
From dir dirModule.py lmModule_method
SecModule Var

  好,那么若是想一次性导入dir目录下的多个文件,可行吗,经测试 import dir.* 是很差使的;import dir 更是很差使。那怎么办呢?
  该包(package)上场了!

  在dir目录下新建“__init__.py”,内容以下:

from . import secModule
from . import dirModule

  有了这个“__init__.py”,就把dir由一个目录,变成了一个包(package)。Python只要在目录下找到这个文件,就会按package来处理,下面咱们修改一下main01.py的内容:

import dir
import lmModule as h

print("From main01.py")

print(h.lmModule_var)

dir.dirModule.lmModule_method()

print(dir.secModule.secModule_var)

  执行一下,可见经过import一个包dir,能够将包中的所在module都引入进来。执行效果以下:

From dir secModule
From dir dirModule
From lmModule.py
From main01.py
LmModule Var
From dir dirModule.py lmModule_method
SecModule Var

  固然__init__.py中也能够定义变量和方法。并且,若是“__init__.py”中包含了变量“__all__”,那么将只有“__all__”中所指定的变量或方法能被外部访问!“__all__”中所指定的变量或方法至关于JAVA中的public。

相关文章
相关标签/搜索