今日内容详细

模块

循环导入问题

两个文件彼此导入彼此

#	循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错

如果确实需要循环导入 那么需要确保双方使用的名字都必须'提前定义好'
(一错再错的办法)
方式1:将导入模块的句式写在定义名字的下面
方式2:将导入模块的句式写在函数体代码内

判断文件类型

判断文件类型是作为模块文件还是执行文件

py文件可以被分为两种类型

1.执行文件
2.被导入文件(模块)

内置变量 __ name __

'''
当__name__所在的文件是执行文件的时候 返回结果是__main__
当__name__所在的文件是被导入文件时候 返回结果是文件名(模块名)
''' # 可以借助于__name__区分被导入的代码和测试代码
if __name__ == '__main__':
当前文件是执行文件的时候才会执行的子代码块 简写方式:
直接输入main之后按tab键即可
# 常用于启动脚本中

模块的查找顺序

"""
1.先从内存空间中查找
2.再从内置模块中查找
3.最后去sys.path查找(类似于我们前面学习的环境变量)
如果上述三个地方都找不到 那么直接报错!!!
"""

验证先从内存空间中查找

import md1
import time
time.sleep(15) # 睡眠期间将md1文件删除
print(md1.name)

验证再从内置模块中查找

import time
print(time)
print(time.time()) '''在创建py文件时候一定不要跟内置或第三方的模块名产生冲突'''

验证sys.path

import sys
print(sys.path) # 结果是一个列表 里面存放了很多路径
# 内存中和内置中都没有要查找的模块时 就会去sys.path里面的路径中挨个查找
'''
sys.path中虽然有很多路径 但是只需要重点关注第一个路径,也就是执行文件所在的路径
查找模块的时候只需要站在执行文件所在的路径查看即可.
'''

解决

主动添加sys.path路径(类似于添加环境变量)
import sys

sys.path.append(r'/Users/qingqin1130/PycharmProjects/DayoneDay/aaa')

import mddd
print(mddd.name) """
pycharm会自动将项目目录所在的路径添加到sys.path中
"""
利用from...import...句式指名道姓的查找
from aaa import mddd  # 从文件夹aaa中导入mddd模块
print(mddd.name)
from aaa.bbb.ccc import mm # 通过点的方式进入下一层目录
print(mm.name)

绝对导入与相当导入

在导入模块的时候,无论导入的句式是在执行文件中还是在被导入文件中,一切查找模块的句式都是以执行文件为准

绝对导入

'''永远按照执行文件所在的路径一层层往下查找'''

相对导入

相对导入打破了必须参照执行文件的所在路径的要求,只需要考虑当前模块所在的路径然后使用特殊符号' . '去查找其他模块即可

from . import a

'''  相对导入只能在被导入文件中使用 不能在执行文件中使用'''

小知识

	.  表示当前路径
.. 表示上一层路径
../.. 表示上上一层路径 '''若想一劳永逸 那么就只使用绝对导入即可'''

概念

包就是一个含有__init__.py文件的文件夹,文件夹内可以放置子模块或子包(内部存放了多个模块文件)

注*

#1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包会报错

#2. 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包的本质就是一种模块

包的使用

首次导入包(如import pool)同样会做三件事:

1、执行包下的__init__.py文件

2、产生一个新的名称空间用于存放__init__.py执行过程中产生的名字

3、在当前执行文件所在的名称空间中得到一个名字--包名,该名字指向__init__.py的名称空间,例如 pool.xxx和 pool.yyy中的xxx和yyy都是来自于 pool 下的__init__.py,也就是说导入包时并不会导入包下所有的子模块与子包

向包索要名字

"""
在导入包的时候,索要名字其实是跟包里面的__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块 那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字 2.也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在 直接当成普通文件夹即可
"""

软件开发目录规范

# 我们实际工作中编写的程序软件都是有很多文件夹和文件组成的
这些文件夹和文件其实都有各自存在的意义和主要功能
"""
查看文件名称很多时候可以找到相同文件名的文件
"""

bin文件夹

存放程序的启动文件		start.py

conf文件夹

存放程序的配置文件   settings.py

core文件夹

存放程序的核心业务   src.py
就是最为重要的代码 能够实现具体需求

lib文件夹

存放程序公共的功能   common.py

db文件夹

存放程序的数据				userinfo.txt

log文件夹

存放程序的日志记录		log.log

readme文本文件

存放程序的说明、广告等额外的信息

requirements.txt文本文件

存放程序需要使用的第三方模块及对应的版本

最新文章

  1. Android studio 使用Gradle发布Android开源项目到JCenter 总结
  2. 简单的HttpClient使用
  3. SQL 行列倒置
  4. 拼接字符串去掉最后多余的串,JSON的遍历
  5. P6 EPPM 安装与配置指南 16 R1 2016.4
  6. hdu1873优先队列
  7. Android 检查设备是否存在 导航栏 NavigationBar
  8. strstr,strchr,strtr 比较
  9. Name lookup
  10. Android菜鸟的成长笔记(11)——Android中的事件处理
  11. jquery实现菜单功能(单击展开或者关闭)-一般应用于后台
  12. 【C语言】一些重要的知识点
  13. C和C++混合编程之 extern “C”的使用
  14. CTSC 2017 滚粗记
  15. C++模板入门教程(一)——模板概念与基本语法
  16. Linux.Centos6编译安装nginx
  17. QPushButton class
  18. arcgis api 3.x for js 入门开发系列十三地图最短路径分析(附源码下载)
  19. 7.Django|分页器
  20. Manjaro 初始配置----anaconda-pycharm-opencv-tensorflow

热门文章

  1. 这些OAuth2客户端的认证方式你未必了解
  2. pyinstaller打包Django项目
  3. jQuery--属性和CSS
  4. Mybatis框架基础入门(五)--输入映射和输出映射
  5. Springmvc入门基础(四) ---参数绑定
  6. Vue手动集成less预编译器
  7. 处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解(二)
  8. 设计一个简单的devops系统
  9. vulnhub mrRobot渗透笔记
  10. 【网易云信】H5 容器技术方案