【python基础语法九】模块和包

模块

# 文件就是一个模块,文件夹就是一个包
# 文件夹里面可以有很多文件,就相当于包中有好多的模块.

import 模块或者包(包是文件夹,模块是文件)
模块不会被重复导入,引入一次终生受益 (模块内代码只执行一次)
'''
调用的时候:
	模块.变量
	模块.函数
	模块.类
'''

# import.引入并起别名 , as 后面写这个模块的别名
别名.变量
别名.函数
别名.# import导模块的时候,会从sys.path提供的路径下去找,找不到就报错
# import sys
# print(sys.path)

1. import 导入模块

# main.py
import mymodule

# (1) 模块.变量
print(mymodule.cat) # 甜甜
# (2) 模块.函数
mymodule.jump()
# (3) 模块.类
print(mymodule.Classroom().name)

# mymodule.py
cat = "甜甜"
dog = "旺财"

def jump():
	print("小猫能上树")

def lookdoor():
	print("小狗能看门")
	

class Classroom():
	name = "python32"

2. 导入任意模路径下的任意模块

"""
默认导入当脚本文件同级目录下的模块等..
系统执行流程: 首先看一下sys.path里面有没有想要导入的这个模块路径,
如果有,默认导入,如果没有,需要手动追加
"""
# import导模块的时候,会从sys.path提供的路径下去找,找不到就报错
# import sys
# print(sys.path)

sys.path.append(r"D:\python32_gx\test")
import mymodule2 # 导入模块是,不需要加文件名后的 .py 后缀

3. from .. import .. 基本使用

"""from .. 从哪里(模块名/路径) import .. 引入具体的某个成员"""

# 导入单个成员
from mymodule import dog
print(dog)

# 导入多个成员
from mymodule import jump,lookdoor
jump()
lookdoor()

# 导入所有成员 *带有所有
# from mymodule import *
# print(dog)
# print(cat)

# 设置*号导入的范围
from mymodule import *
print(dog) #  error
print(cat)
"""
在要导入的模块中指定
__all__ = ["cat"]
表示 在外面 import * 时只能使用cat。 具名导入依然没有问题
"""

# 设置引入成员的别名 as
from mymodule import cat as c , lookdoor as ld
print(c)
ld()

4. __name__ 的使用

"""
#返回模块名字的魔术属性 __name__
    如果当前文件是直接运行的,返回"__main__"字符串
    如果当前文件是间接导入的,返回当前文件名(模块名)
"""
# res = __name__
# print(res,type(res)) # __mian__ <class 'str'>

"""
把需要引入的代码写在if判断的上面
把需要做简单测试的代码,不需要引入的代码写在if判断的下面,防止导入;
"""
if __name__ == "__main__":
	print("测试代码")
	jump()
	lookdoor()

"""
文件夹:包  文件:模块
当引入包时,会自动指定包中__init__.py的初始化文件,对包进行初始化
"""

1. import 引入包的语法

import package1
# 导入包的属性
print(package1.ceshi1)

# 导入包下的某个模块
# 方法一
import package1.mywork
package1.mywork.mygetsize()

# 方法二 as 起别名
import package1.mywork as pm
pm.mygetsize()
# 或者
from package1 import mywork
mywork.mygetsize()

# 方法三 把要引入的模块放到初始化文件 __init__.py 当中进行引入,简化操作
# __init__.py
from package1 import mywork
# main.py
import package1
"""像这样只引入os, 却可以使用os.path.getsize()"""
package1.mywork.mygetsize()

2. from .. import .. 引入包中具体的成员的语法

# 1. 引入包中的属性
from package1 import ceshi2
print(ceshi2)

# 2. 可以指定*号的范围 用__all__
from package1 import *
print(ceshi3)

# 3. 可以用as起别名
from package1 import ceshi2 as c2,ceshi1 as c1
print(c1, c2)

# 4. 引入包中的模块
from package1 import mywork
mywork.mygetsize()

# 5. 引入包中模块下的成员
from package1.mywork import mygetsize
mygetsize()

3. 单入口模式

只通过主文件来调用分模块内容,分模块不单独执行

"""
分模块不能单独进行调用,统一由主文件main进行调用
模块之间的互相嵌套导入,使用相对路径实现
单入口文件必须和包在同一层级,包里面可以含有各种包和模块

# from . import pkg           相对于当前路径引入模块
# from .pkg2 import ceshi204  相对于当前模块引入具体属性
# from .. import pkg2_module1 相对于上一级引入模块
# from ..pkg2_two import pkt1 相对于上一级的某个包引入模块
# from ..pkg2_two.pkt2 import ceshi209 相对于上一级某个包下的某个模块引入某属性

.    当前路径
..   上一级路径
...  上一级的上一级
.... 上一级的上一级的上一级
.....   (这里的点是无限的)
from .......................................... import 模块

相对路径不能被解释器直接引入, 路径找不到
分模块中的文件不能直接执行,必须通过导入到主入口文件,间接执行才能找到对应的路径

含有相对路径的分模块不能直接执行,得通过主入口文件间接执行。
"""

"""使用相对路径进行导入"""
import package2.pkg1.pkg1_m2 as ppp2
print(package2.pkg1.pkg1_m2.ceshi100)
print(ppp2.ceshi100)

# 相对于当前路径找pkg1_m1模块
from . import pkg1_m1
print(pkg1_m1.ceshi103)

# 相对于当前路径pkg1_m1模块中引入ceshi104成员
from .pkg1_m1 import ceshi104
print(ceshi104)

# 找上一级中的一个模块
from .. import pkg_module1
print(pkg_module1.ceshi201)

# 找上一级中的一个模块里的一个成员 
from ..pkg_module1 import ceshi202
print(ceshi202)

# 找上一级包中的具体某个模块
from ..pkg2 import pkg2_m2
print(pkg2_m2.ceshi300)

# 找上一级包中的具体某个模块里的具体的某个成员
from ..pkg2.pkg2_m2 import ceshi301
print(ceshi301)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值