Python从0到1之模块和包

本文详细介绍了Python模块的概念,包括如何定义、导入和使用模块,以及模块中的常见问题和解决方案。同时,文章还深入探讨了Python包的创建和使用方法,帮助读者更好地组织和管理Python代码。

模块

Python模块是一个Python文件,以.py结尾,包含了Python对象定义和Python语句
模块能定义函数,类和变量,模块里也能包含可执行的代码

导入模块的方式

# import 模块名
import math
math.sqrt(9) # 3.0
# from 模块名 import 功能名
from math import sqrt
sqrt(9) # 3.0
# from 模块名 import * (*表示全部)
from math import *
sqrt(9) # 3.0
# import 模块名 as 别名
import math as sx
sx.sqrt(9) # 3.0
# from 模块名 import 功能名 as 别名
from math import sqrt as sq
sq(9) # 3.0

自定义模块

Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是自定义模块名必须要符合标识符命名规则

制作模块

新建一个Python文件 命名为my_module1.py 并定义testA 函数

def testA(a,b):
    return a + b

测试代码

实际开发中,开发编写一个模块后,开发会在文件中添加测试信息如

print(testA(1,2))

此时无论当前文件还是其他已经导入的文件,运行时都会自动执行testA函数的调用
解决办法:只有在当前文件中调用该函数,其他导入的文件不符合该条件,不执行该函数的调用,添加代码

if __name__ =="__main__":
    print(testA(1,2)) # 3

调用模块

import my_module1

print(my_module1.testA(2,3)) # 5

注意事项

如果使用 from … import … 或 from … import * 导入多个模块的时候,且模块内 有同名功能。当调用这个同名功能的时候,调⽤到的是后面导入的模块的功能。

# my_module1.py
def my_test(a,b):
    return a + b 
    
# my_module2.py
def my_test(a,b):
    return a - b 

from my_module1 import my_test
from my_module2 import my_test
print(mytest(5,2)) # 3

模块定位顺序

当导入一个模块,Python解释器对模块位置的搜索顺序是
1.当前目录
2.如果不在当前目录,Python则搜索shell变量pythonpath下的目录
3.如果都没有,Python会查看默认目录,一般为usr/local/lib/python
模块搜索路径存储在system模块的sys.path中,变量里包含当前目录,pythonpath和由安装过程决定的目录
注意:
自己的文件名不要和已有模块名一致,否则导致模块无法使用
导入功能名字一致时,调用的是最后定义或者导入的功能

all

如果一个文件中有__all__变量,当使用from xxx import * 导入时,只能导入这个列表中的元素

# my_module1.py
__all__ = ["testA"]
def testA():
    print("testA")

def testB():
    print("testB")

from my_module1 import *
testA() # testA
testB() # name 'testB' is not defined

将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包。

制作包

  1. 新建包mypackage
  2. 新建包内模块: my_module1 和 my_module2
  3. 模块内代码如下
# my_module1.py
print(1)
def info_print1():
    print("my_module1")

# my_module2.py
print(2)
def info_print2():
    print("my_module2")

导入包

import 包名.模块名

import 包名.模块名
包名.模块名.方法


import mypackage.my_module1
mypackage.my_module1.info_print1()

import mypackage.my_module2
mypackage.my_module2.info_print2()
from 包名 import *

注意:必须在 init.py 文件中添加 all = [] ,控制允许导入的模块列表。
from 包名 import *
模块名.方法

# __init__.py
__all__ = ["my_module1","my_module1"]

from my_package import *
my_module1.info_print1()
my_module2.info_print2()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值