py18. 包、模块、软件开发目录规范

一、什么是包?

包是一个内部带有__init__.py的文件夹,包也可以被导入,并且可以一并导入包下的所有模块。

二、为什么要使用包?

包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来。
随着功能越写越多,我们无法将所有功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性。
在包中有一个__init__.py, 由它来帮我们管理模块。

三、怎么使用包?

import 包.模块名
from 包 import 模块名
from 包.模块名 import 模块中的名字
导入包时发生的事情:

当包被导入时,会执行包中的__init__.py,产生一个名称空间。
,会将__init__.py中的所有名字添加到名称空间中。
接着会将包下所有的模块的名字加载到__init__.py产生的名称空间中。
导入的模块指向的名称空间其实就是__init__.py产生的名称空间。
强调:
  在python3中,即使包里面没有__init__.py文件,import 包仍然不会报错,而在python2中,包里面一定要有该文件,否则import 包报错

模块

一、什么是模块?

模块是一系列功能代码的集合体。
在Python中,一个.py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能

- 模块的三种来源:

1.python内置的模块: (python解释器的)
比如: sys\time\os\turtle

2.第三方的模块: (别人写的)
比如: requests

3.程序员自定义的模块: (自己写的)
比如: 自己定义的demo.py文件

- 模块的四种表现形式:

1.使用python编写的py文件。(了解)
2.编译后的共享库DLL或者是C或者C++库。(了解)
3.包下面带有__init__.py的一组py文件。
- 包
- init.py
- demo.py
- demo2.py
4.python解释器下的py文件。
- python解释器下的文件夹
- 一个个的py文件

二、 为什么要使用模块?

模块可以帮我们更好地管理功能代码,比如: 函数…
可以将项目拆分成一个个的功能,分别存放在不同的py文件(模块)中。

三、 如何创建,编写模块,并使用模块?
鼠标右键创建py文件
- 在py文件编写python代码

在一个文件中,通过import关键字导入模块
import 模块名
注意: import 模块时,模块不能加.py后缀

在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)

模块在首次导入时,导入的模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。

在文件开头导入模块属于全局作用域,在函数内导入的模块则属于局部的作用域。

模块在导入时发生的事情:

会先执行当前执行文件,并生成当前执行文件的的名称空间。
当执行到被导入模块的代码时,被导入的模块会产生一个模块的名称空间。
将被导入模块的名称空间加载到内存中。
import foo #导入模块foo
a=foo.x #引用模块foo中变量x的值赋值给当前名称空间中的名字a
foo.get() #调用模块foo的get函数
foo.change() #调用模块foo中的change函数
给模块起别名 as
import 模块 as 模块的别名

四、 模块的导入方式

import 模块名

  • 在执行文件中直接import导入

from 包/模块名 import 模块名/(函数名、变量名、类名)

  • 在执行文件中直接import导入
五、 循环导入问题
    - m1.py
        print('正在导入m1')
		from m2 import y
		x='m1'

    - m2.py
        print('正在导入m2')
		from m1 import x
	- run.py
		import m1                #执行run.py会报错


    - 解决循环导入问题:
        1.需要查找的名字放在导入模块的上方
        2.在函数内部导入,将模块加载到局部名称空间中
六、 py文件区分两种用途:模块与脚本
编写好的一个python文件可以有两种用途:
    一:脚本,一个文件就是整个程序,用来被执行
    二:模块,文件中存放着一堆功能,用来被导入使用
    
print(__name__)

__name__的值:

1、在文件被直接执行的情况下,等于'__main__'
2、在文件被导入的情况下,等于模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

if __name__ =='__main__'
	func()
七、 模块的搜索路径

模块的查找顺序:


内存中已经加载的模块
内置模块
sys.path路径中包含的模块
强调:sys.path的第一个路径是当前执行文件所在的文件夹

import sys
print(sys.path)   

import sys
print(sys.modules)  #查找内存中存在的模块

软件开发目录规范

注意: 每一次写项目时,都要新建一个文件夹与项目工程,必须让项目文件夹作为项目根目录。

-项目的根目录
    - conf:
        - 用于存放配置文件的文件夹
        - settings.py
    
    - core:
        - 核心业务代码
        - src.py
    
    - interface:
        - 接口, 接口内写获取数据前的逻辑代码,通过后才能获取数据
        - user_interface.py
    
    - db:
        - 用于存放文件数据
        - data.json
    
    - lib:
        - 存放公共功能文件
		-common.py
    
    - log:
        - 用于存放日志文件,日志用于记录用户的操作记录
        - user_log.log
    
    - bin:
        - 里面存放启动文件 / - 启动文件
        - start.py
   
    - readme.txt:
        - 项目说明书, 用户告诉使用者项目的操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴声浮或沉__听懂只一人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值