• python中的模块及包及软件目录结构规范


    知识内容:

    1.模块的定义与分类

    2.模块的导入

    3.模块与包

    4.不同目录下的模块调用

    一、模块的定义与分类

    1.什么是模块

    模块就是实现了某个功能的代码集合,模块是由一大堆代码构成的

    类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

    如:os 是系统相关的模块;re是处理正则表达式相关的模块

    2.模块的分类

    模块可以分为三种:

    • 自定义模块
    • 内置标准模块(又称标准库)
    • 开源模块

    自定义模块 和开源模块的使用参考 http://www.cnblogs.com/wupeiqi/articles/4963027.html

    二、模块的导入

    1.3种导入模块的方式:

    • import 模块名               使用这种方式导入模块后如要使用模块中的对象可以使用以下方法:  模块名(别名).对象名
    • from 模块名 import 对象名
    • 导入一个模块中的所有对象: from 模块名 import * 

    注:  不推荐使用最后一种

    2.为模块或对象起别名

    • import 模块名 as 别名
    • from 模块名 import 对象名 as 别名
    1 import numpy as np
    2 import pandas as pd
    3 from bs4 import BeautifulSoup as Bf

    3.在一行导入多个模块

    1 import re, numpy, pandas

    4.导入模块的顺序

    (1) 导入python标准库中的模块(python环境自带模块),比如说ossys emath

    (2) 导入第三方库模块,比如说numpyscrapy

    (3) 导入自己定义或者开发的本地模块

    示例:

    复制代码
     1 # __author__ = "wyb"
     2 # date: 2018/3/9
     3 
     4 import os           # 导入python自带模块os
     5 import sys          # 导入python自带模块sys
     6 import requests     # 导入python第3方模块requests
     7 # import package    # 导入自己写的模块package
     8 
     9 from bs4 import BeautifulSoup   # 从bs4包中导入BeautifulSoup模块
    10 from math import sqrt           # 从math模块中导入sqrt函数
    复制代码

    5.模块搜索路径

    模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    官网解释:https://docs.python.org/3/tutorial/modules.html#the-module-search-path

    搜索路径:

    当一个命名为spam的模块被导入时 解释器首先会从内建模块中寻找该名字 找不到,则去sys.path中找该名字 sys.path从以下位置初始化

    1 执行文件所在的当前目录

    2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)

    3 依赖安装时默认指定的

    强调:自定义的模块名千万不要跟python标准库的模块名重复,否则后果很严重

    三、模块与包

    1.使用模块的好处

    • 大大提高代码的可维护性
    • 提高代码复用性

    注:

    使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

    2.什么是包

    你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package),如下所示:

    一个文件夹中管理多个模块文件,这个文件夹就称为包,包里也可以含有文件夹 

    注: 每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。

    __init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块。

    自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块

    3.导入包中的模块

    导入包的本质: 执行__init__.py

    所以导入包中的模块不能直接使用import package_name再使用package_name.module_name.function_name(),这样做会报错

    真正的做法应该是from package_name import module_name 然后module_name.function_name(),这样做才是对的

    四、不同目录下的模块调用

    1.问题需求

    项目目录下的bin目录里面的atm.py是程序的启动入口,由此启动项目,而core目录里的main.py是程序的主入口,那么如何能实现让atm.py能调用main.py运行程序呢?

    2.解决问题

    (1)在main.py()中写入:

    1 # 项目程序的主入口,不在此写主要逻辑,只是在这里调用项目其他模块
    2 
    3 def login():
    4     print("welcome to my atm")

    (2)在atm.py中获取整个软件目录的跟目录:

     1 import os
     2 import sys
     3 
     4 # 获取该项目整个外层的路径: D:wybpythonoldboy2.进阶(函数,内置方法,模块,文件操作、字符编码)软件目录结构规范ATM
     5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     6 print(BASE_DIR)
     7 
     8 sys.path.append(BASE_DIR)   #添加环境变量
     9 
    10 from core import main
    11 
    12 main.login()   # 输出welcome to my atm
  • 相关阅读:
    restic 快速安全可靠的数据备份工具
    使用sidekick 负载均衡minio 集群
    sidekick简单试用
    使用nfpm打包deb&&rpm
    sidekick minio 团队开源的高性能http sidecar 负载均衡器
    baretest小巧但是强大的jest可选测试框架
    fetchq-cron 基于webhook 的任务调度工具
    uwsgi+nginx+flask+docker+supervisord oracle中文乱码问题
    gqless 一个强大灵活的不用写query的graphql client
    cortex 1.0 版本发布
  • 原文地址:https://www.cnblogs.com/wyb666/p/8692544.html
Copyright © 2020-2023  润新知