python模块简介
python模块:
python中的模块是什么?简⽽⾔之,在python中,⼀个⽂件(以“.py”为后缀名的⽂件)就叫做⼀个模块,每⼀个模块在python⾥都被看做是⼀个独⽴的⽂件。模块让你能够有逻辑地组织你的 Python 代码段。把相关的代码分配到⼀个模块⾥能让你的代码更好⽤,更易懂。模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。⼀个模块编写完毕之后,其他模块直接调⽤,不⽤再从零开始写代码了,节约了⼯作时间;避免函数名称和变量名称重复,在不同的模块中可以存在相同名字的函数名和变量名,但是,切记,不要和系统内置的模块名称重复。
模块的三种来源:
1.内置的(python解释器⾃带)
2.第三⽅的(别⼈写的)
3.⾃定义的(我们⾃⼰写的)
模块的四种表现形式:
1.使⽤python编写的py⽂件(也就意味着py⽂件也可以称之为模块:⼀个py⽂件也可以称之为⼀个模块)
2.已被编译为共享库或DLL的C或C++扩展(了解)
3.把⼀系列模块组织到⼀起的⽂件夹(⽂件夹下有⼀个__init__.py⽂件,该⽂件夹称之为包)包:⼀系列py⽂件的结合体
4.使⽤C编写并连接到python解释器的内置模块
为什么要⽤模块:
1.⽤别⼈写好的模块(内置的,第三⽅的):典型的拿来主义,极⼤的提⾼开发效率
2.使⽤⾃⼰写的模块(⾃定义的):当程序⽐较庞⼤的时候,你的项⽬不可能只在⼀个py中那么当多个⽂件中都需要使⽤相同的⽅法的时候可以将该公共的⽅法写到⼀个py⽂件中其他的⽂件以模块的形式导过去直接调⽤即可
在我们使⽤模块的时候⼀定要区分哪个是执⾏⽂件,哪个是被导⼊⽂件。
#我们先⾃定义⼀个模块名为mod.py;
print("hello world")
name = "fan"
def func1():
print("fan1")
def func2():
print("fan2")
func()
#然后我们使⽤⾥⼀个py⽂件进⾏导⼊这个模块;
import mod
import mod
import mod
import语句
#打印输出:
hello world
#可以发现只打印了⼀次,是因为每次导⼊模块时,解释器都回去检查⼀下这个模块有没有之前被导过,多次导⼊不会再执⾏模块⽂件。
"""
模块导⼊的过程:
1.到这个需导⼊的模块;
2.判断这个模块是否被导⼊过;
如果没有被导⼊过:
创建⼀个属于这个模块的命名空间;如果⽤户没有定义变量来引⽤这个模块的内存地址的话,
那么就使⽤模块的名称来引⽤这个模块的内存地址;如果⽤户使⽤as来指定变量接受这个内存地址的话,
那么就将内存地址赋值给这个变量;且下⽂在调⽤时只能使⽤这个变量进⾏调⽤不能再使⽤模块名进⾏调⽤了,然后执⾏这个模块中的代码。
如果该模块已经被导⼊过:
那么解释器不会重新执⾏模块内的语句,后续的import语句仅仅是对已经加载到内存中的模块的对象
关于导⼊的模块与当前空间的关系:
带⼊的模块会重新开辟⼀块独⽴的名称空间,定义在这个模块中的函数把这个模块的命名空间当做全局命名空间,
这样的话当前的空间就和模块运⾏的空间分隔了,谁也不影响谁;
为模块起别名:
模块在导⼊的时候开辟了新空间内存,默认是使⽤模块的名称来引⽤这个内存地址的,有时候模块的名称很长再加上执⾏调⽤⾥⾯的功能的时候,
就显的很不⽅便,为了更好的使⽤模块,我们可以给模块起别名;也就是在导⼊模块的时候我们不让它使⽤默认的名字来引⽤内存地址,
⽽是由我们⾃⼰定义的变量来引⽤这个模块的内存地址;
⽅法:import mdddddddddd as md
这样的话就表⽰使⽤变量md来引⽤这个内存地址,然后我们在⽂中再使⽤这个模块的时候,只要使⽤md来调⽤这个模块⾥的功能即可。
"""
# import datetime是引⼊整个datetime模块,如果使⽤datetime模块中的datetime类,
需要加上模块名的限定。
import datetime
print w()
# 如果不加模块名限定会出现错误:TypeError: 'module' object is not callable \
AttributeError: 'module' object has no attribute 'now'
# from datetime import datetime是只引⼊datetime模块⾥的datetime类,
在使⽤时⽆需添加模块名的限定。
from datetime import datetime
w()
模块的查顺序是:先从内存中,内存中没的话会去内置中,内置中不到的话会去sys.path中(环境变量)
if __name__ == '__main__':
只要我们创建了⼀个模块(⼀个.py⽂件),这个模块就有⼀个内置属性name⽣成,该模块的 name 的值取决于如何应⽤这个模块。简单的说就是,如果我们直接运⾏该模块,那么__name__ == "__mai
n__";如果你 import ⼀个模块,那么模块name 的值通常为模块⽂件名。
如,创建⼀个test1.py:模块中,⾸先定义了函数func(),⽤来打印出hello, world!
然后判断__name__ 是否等于__main__,如果等于,就打印。
def func():
print('hello, world!')
if__name__ == "__main__":
func()
# 输出结果为:
hello, world!
# 说明__name__ 等于 __main__
# 当⽂件被当做执⾏⽂件执⾏的时候__name__打印的结果是__main__
# 当⽂件被当做模块导⼊的时候__name__打印的结果是模块名(没有后缀)
模块的绝对导⼊和相对导⼊:
绝对导⼊的格式为 import A.B 或 from A import B,相对导⼊格式为 from . import B 或 from ..A import B,.代表当前模块,..代表上层模块,...代表上上层模块,依次类推。
相对导⼊可以避免硬编码带来的维护问题,例如我们改了某⼀顶层包的名,那么其⼦包所有的导⼊就都不能⽤了。但是存在相对导⼊语句的模块,不能直接运⾏,否则会有异常:
如果是绝对导⼊,⼀个模块只能导⼊⾃⾝的⼦模块或和它的顶层模块同级别的模块及其⼦模,
如果是相对导⼊,⼀个模块必须有包结构且只能导⼊它的顶层模块内部的模块所以,如果⼀个模块被直接运⾏,则它⾃⼰为顶层模块,不存在层次结构,所以不到其他的相对路径,所以如果直接运⾏python xx.py ,⽽xx.py有相对导⼊就会报错
# 绝对导⼊
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# 相对导⼊:
import sys, os
from . import models
from ..proj import settings
"""
绝对导⼊必须依据执⾏⽂件所在的⽂件夹路径为准
绝对导⼊⽆论在执⾏⽂件中还是被导⼊⽂件都适⽤
相对导⼊
.代表的当前路径
..代表的上⼀级路径
.
..代表的是上上⼀级路径
相对导⼊不能再执⾏⽂件中使⽤
相对导⼊只能在被导⼊的模块中使⽤,使⽤相对导⼊就不需要考虑执⾏⽂件到底是谁只需要知道模块与模块之间路径关系
"""
软件开发⽬录规范:
1.⾸先是项⽬名:
2.bin ⽂件夹:
start.py 启动⽂件
settings.py 项⽬配置⽂件
< ⽂件夹:
src.py 项⽬核⼼逻辑
5.db ⽂件夹:
数据库相关⽂件
6.lib ⽂件夹:
common.py 项⽬所⽤到的公共功能
7.log ⽂件夹:
log.log 项⽬的⽇志⽂件
8.Readme:
⽂本⽂件:项⽬简介
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论