非常详细非常零基础的Python教程:模块和包

146 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情

模块和包

模块和包

模块和包的理解

模块可以理解成一个个py文件,比如你写了个a.py和b.py,这可以理解成写好的模块,而包则是理解成一个个存放模块的文件夹(包是包含__init__.py的文件夹)。

什么是导包

python中有内置的模块,当你需要用到的时候,就需要将这个模块和包导入到你的程序中。当然除了内置模块以外,开发者还可以导入自己写的包。比如python需要用python中的第三方库(理解成第三方包也行)numpy,我们就需要导入一下:import numpy,就类似这样一个动作称为导包。在枚举类部分,我们用了from enum import Enum这样一句话来导包。这句话的意思是从enum这个包下导入Enum这个枚举类。

导入模块

导入模块需要用到import。主要有下面两种用法。

import 模块名1 [as 别名1] ,模块名2 [as 别名2]...

用这种方式会将模块中所有的东西导入进去,中括号的意思是可选的,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀。比如这样一句话:import numpy as np,就是给numpy这个模块起了别名,我们就不需要numpy.xxx去调用东西了,直接np.xxx去调用。

举例:

# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
from 模块名 import 成员名 as 别名

使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。 同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。 针对这种方法,使用form 模块名 import *也可以将模块中所有东西导入进去。

# 导入sys模块的argv成员
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])

一般不推荐使用这种方式导入所有成员,因为如果同时导入类多个包,他们中有同名的成员(属性或方法),那你去调用就不太容易区分。

自定义模块

Python 模块就是 Python 程序,换句话说,只要是 Python 程序,都可以作为模块导入。例如,下面定义了一个简单的模块(编写在 demo.py 文件中):

name = "Python教程"
add = "http://c.abc.net/python"
print(name,add)
def say():
    print("人生苦短,我学Python!")
class CLanguage:
    def __init__(self,name,add):
        self.name = name
        self.add = add
    def say(self):
        print(self.name,self.add)
#########测试代码#########
say()
clangs = CLanguage("CCCC","http://c.abc.net")
clangs.say()

可以看到,我们在 demo.py 文件中放置了变量(name 和 add)、函数( say() )以及一个 Clanguage 类,该文件就可以作为一个模板。在此基础上,我们新建一个 test.py 文件,并在该文件中使用 demo.py 模板文件,即使用 import 语句导入 demo.py:

import demo

到这里为止,我们直接运行程序,程序会直接出来这样的运行结果:

Python教程 http://c.abc.net/python
人生苦短,我学Python!
CCCC http://c.abc.net

很明显这不是我们想要的,我们的测试代码还没写呢,这里执行的是demo.py中的结果,我们想要的是:我们在test文件中写什么执行什么,现在我们还什么都没写,就有运行结果了,不太对(就是demo中的测试代码不应该被执行)。要实现这样的效果,我们需要用到python中内置的__name__变量。

当直接运行一个模块时,name 变量的值为__main__;而将模块被导入其他程序中并运行该程序时,处于模块中的 __name__ 变量的值就变成了模块名。因此,如果希望测试函数只有在直接运行模块文件时才执行,则可在调用测试函数时增加判断,即只有当 name =='main' 时才调用测试函数(导入其他模块的话,这里的name变量就不是main了,也就不执行测试函数了)。这段理解不了的话就将if __name__ == '__main__'当成主函数,程序的开始都是从主函数开始的。

继续完善test.py程序:

import demo
if __name__ == '__main__':  #这理解成主函数即可
    say()
    clangs = CLanguage("CCCC","http://c.abc.net")
    clangs.say()