摘要:导入模块、导入包、编程规范

以My_module为例,My_module的代码如下:
__all__ = ['name','read'] print('in mymodule') name = '帅锅' def read():
print('in read',name) def read2():
print('in read2',name) if __name__ == '__main__':
print('in mymodule')
print('__name__ : ',__name__) 一、导入模块
1、import 模块名
1-1、在import的过程中发生了哪些事情:
import一个模块相当于先执行了一次这个被导入模块,然后在本命名空间建立一个与被导入模块命名空间的联系,
相当于在本命名空间新建了一个变量,这个变量名称是被导入模块的名称,指向被导入模块的命名空间。 1-2、一个模块不会被重复导入,也就是说,import了一次这个模块,然后再import一次,也只是执行了第一次的imoptr
import My_module # 执行了
import My_module # 不会执行 1-3、如何去使用被导入模块中的名字
import My_module
print(My_module.name) # 打印出My_module中的name
My_module.My_module_fun() # 执行了My_module中的函数 1-4、小结导入模块的过程
导入模块的时候:
1.寻找模块
2.如果找到了,就开辟一块空间,执行这个模块
3.把这个模块中用到的名字都收录到新开辟的空间中
4.创建一个变量来引用这个模块的空间(变量名与这个模块名一致) *1.模块不会被重复导入
*2.模块和文件之间的内存空间始终是隔离的
*3.模块的名字必须是符合变量命名规范的
1-5、本文件中存在与导入模块相同的变量
# My_module中的内容:
name = '帅锅'
def read():
print('in read',name) # 执行文件的内容:
import My_module
My_module.read() # in read 帅锅 name = 'SB'
My_module.read() # in read 帅锅 My_module.name = 'SB'
My_module.read() # in read SB
总结:
在本文件中定义了一个与导入模块相同的变量,
并不会影响导入模块中的变量,因为这两个变量是存在不同的命名空间中的,互不影响。 1-6、本文件中存在一个变量,这个变量名是导入的模块名
这个时候就相当于把指向导入模块的指针断开了,再指向新的值
My_module = 1
print(My_module) #
My_module.read() #报错

1-7、一次导入多个模块的方式
import os,time,My_module
但是一般不建议这么使用,因为根据pep8规范(python编写规范):
我们导入模块的顺序应该是:内置模块,第三方模块,自定义模块
import os # 内置
import time # 内置 import django # 第三方 import my_module # 自定义 1-8、给模块起别名,一旦给模块起了别名,那么原名就不能使用了
import My_module as m
print(m.name) # 帅锅
print(My_module.name) # 报错 1-9、如何判断模块能否被导入
sys.path是一个存放了所有模块路径的列表,
一个模块是否能被导入,就看这个模块所在的目录在不在sys.path中,
如果这个模块的路径不在sys.path中,那么就不可被导入,
不过可以自己手动添加:sys.path.append(“自定义的模块路径”) 1-10、循环引用模块(看图)
1-11、运行一个py文件的两种方式方式
1,直接运行它 :
在cmd终端运行: python xx.py 或者在pycharm中直接运行
当用这种方式运行这个py文件,那么这个py文件就称为:脚本
这个时候py文件中的:__name__ == '__main__' 2,导入它 :
导入一个模块,也会运行一次这个py文件
当用这种方式运行py文件,这个py文件就称为:模块
这个时候py文件中的:__name__ == '模块名'
import My_module
__name__ = 'my_module ' 例如:
在My_module中有这样的代码:
print('in mymodule')
print('__name__ : ',__name__)
那么直接在My_module中运行结果为:in mymodule __name__ : __main__ 在导入My_module的文件中执行导入模块(会默认执行一次My_module)
import My_module
然后执行,结果为:in mymodule __name__ : My_module 2、from xx import xx
2-1在from import的过程中发生了哪些事情
from My_module import name
from My_module import read
1,要找到My_module
2,开空间,执行my_module
3,所有的My_module中的名字都存储在My_module所属的空间中
4,本文件空间中建立对应的变量名(name,read),分别取引用My_module空间中对应的名字 from My_module import name
from My_module import read
print(name) # 帅锅
read() # in read 帅锅

2-2、引用模块的变量后,进行修改(看图)
from My_module import name
from My_module import read
print(name) # 帅锅 name = 'aaa'
read() # in read 帅锅 print(name) # aaa


2-3、from import 多个内容
from My_module import name,read,read2 2-4、给导入的内容起别名
from My_module import name as n,read as r,read2 as r2 2-5、from import *和 __all__关系
1,只有from import * 没有__all__的时候,My_module的所有变量都可以在本文件中使用
from My_module import *
print(name) # 帅锅
read() # in read 帅锅
read2() # in read2 帅锅 2,即有from import * 也有__all__的时候,只有被__all__声明的变量才能在本文件中使用
My_module中:__all__ = ['name','read'] 本文件中执行:
from My_module import *
print(name) # 帅锅
read() # in read 帅锅
read2() # 报错:name 'read2' is not defined 2-6、模块的导入和修改
模块在导入后,在程序运行期间,你再去修改导入的模块,导入的内容依旧是不变的。
如果硬是要在程序运行期间修改模块的内容,并让修改的内容生效,那么可以使用reload.
from importlib import reload
'''
在这期间修改模块的内容
'''
# 重新reload,修改的内容就生效了
reload(My_module) 3、补充的内容
1.pyc文件、pyi文件 *
pyc文件是导入包的时候自动产生的字节码文件,只能提高程序的启动效率并不能提高程序的执行效率
2.模块的导入和修改 *
3.模块的循环引用 **** 不能循环
4.dir(模块名) ***
可以获取这个模块中的所有名字 二、导入包
1、
1.无论是import形式还是from...import形式,凡是在导入语句中遇到带点的都是关于包的导入语法。
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
4.导入包就相当于执行力这个包下的__init__.py文件,在__init__下导入了什么模块,你就等于导入了什么模块
强调:
  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包会报错
  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块 2、目录结构创建
创建代码目录:
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l) 目录结构:
glance/ #Top-level package ├── __init__.py #Initialize the glance package ├── api #Subpackage for api │ ├── __init__.py │ ├── policy.py │ └── versions.py ├── cmd #Subpackage for cmd │ ├── __init__.py │ └── manage.py └── db #Subpackage for db ├── __init__.py └── models.py 文件内容
#policy.py
def get():
print('from policy.py') #versions.py
def create_resource(conf):
print('from version.py: ',conf) #manage.py
def main():
print('from manage.py') #models.py
def register_models(engine):
print('from models.py: ',engine) 3、注意事项
1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
凡是在导入时带点的,点的左边都必须是一个包,右边可以是包也可以是文件,否则非法。可以带有一连串的点,如glance.db.models,但都必须遵循这个原则。
2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。 4、import:import什么,调用的时候就要写全
import glance.db.models
glance.db.models.register_models('hello') # from models.py: hello 5、from...import
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
from glance.db import models
models.register_models('hello') from glance.db.models import register_models
register_models('hello') 6、__init__.py文件
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件,
也就是说每次导入一个包都会先执行包下的__init__.py文件。
在包api下的__init__.py文件写入这样的代码:
print('__init__')
__all__ = ['policy'] 然后在主程序执行:
from glance.api import *
policy.get() # __init__ # from policy.py
versions.create_resource('aa') # 报错:name 'versions' is not defined 7、绝对导入和相对导入
我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以glance作为起始 相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
一旦使用了相对导入,那么这个文件只能作为模块使用,不用直接执行了。 8、单独导入包
直接单独导入包,比如import glance,是不会导入包中的模块的,
直接导入包名称的时候,只会去执行包中的__init__文件,所以单独导入包名称的时候,需要
去包下的__init__文件中导入相应的模块。 例如:在与glance同级的test.py文件下运行代码:
import glance
glance.api.policy.get() # 报错:module 'glance' has no attribute 'api' 导入包就等于导入包下__init__的内容,而此时在glance的__init__内没有导入相应的内容,所以会报错 在glance包下的__init__写入:
from glance.api import policy 再次执行
import glance
glance.api.policy.get()
结果:from policy.py 三、开发规范(插图)

python之模块、包的导入过程和开发规范的更多相关文章

  1. python基础--模块&包

    一.模块 1.模块是程序 任何Python程序都可以作为模块导入. 程序的保存也很重要,如果想把程序保存在C:\python (Windows)目录下,需要告诉解释器在哪里寻找模块了. >> ...

  2. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  3. python基础(12)-包的导入&异常处理

    包的导入 几种导入方式 import 包名 import time time.time() import 包名,包名 import time,sys time.time() sys.path from ...

  4. python之模块定义、导入、优化详解

    一.模块 1.模块的定义 模块是一组包含了一组功能的python文件,比如test.py,模块名为test,可以通过import test进行调用.模块可以分为以下四个通用类别 1 使用python编 ...

  5. Python Day5 模块 包

    一:区分Python文件的2种用途 1个Python文件的2种用途 1.1 当作脚本执行:        if __name__ == '__main__': 1.2 当作模块导入使用     if ...

  6. python基础之包的导入

    包的导入 python是一门灵活性的语言 ,也可以说python是一门胶水语言,顾名思义,就是可一导入各类的包, python的包可是说是所有语言中最多的.当然导入包大部分是为了更方便,更简便,效率更 ...

  7. python常用模块 以及第三方导入

    python常用模块 1模块的分类 标准模块(内置模块)( 标准库 )300 第三方模块 18万 pip install 直接通过pip安装 软件一般会被自动安装你python安装目录的这个子目录里 ...

  8. python中模块包的离线下载教程

    1.简介 当我们进行Python项目的迁移时(例如迁移到另外一台服务器上),如果该服务器要求离线安装, 往往需要我们将项目中的所需模块包进行离线操作. 2.教程 2.1 首先安装pip2pi模块,它可 ...

  9. Python安装模块包

    可以利用pycharm安装模块包 使用这种方法安装时,可能会报下面类型的异常 AttributeError: module 'pip' has no attribute 'main' 出现这这样的异常 ...

随机推荐

  1. vue遍历数组和对象的方法以及他们之间的区别

    前言:vue不能直接通过下标的形式来添加数据,vue也不能直接向对象中插值,因为那样即使能插入值,页面也不会重新渲染数据 一,vue遍历数组   1,使用vue数组变异方法 pop() 删除数组最后一 ...

  2. Android为TV端助力 MediaPlayer 错误代码(error code)总结 转载

    public static final int MEDIA_ERROR_IO Added in API level 17 File or network related operation error ...

  3. MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

    一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...

  4. [spring transaction],service实现类中非事务方法直接调用自身事务方法导致事务无效的原因

    首先,准备service接口,两个 public interface AccountService { public void createAccount(Account account, int t ...

  5. python 之 查找某目录中最新的文件

    记录一下这个方法,感觉很有用!>.< import os def find_newest_file(path_file): lists = os.listdir(path_file) li ...

  6. 我的第一个python web开发框架(34)——后台管理系统权限设计

    框架底层和接口终于改造完成了,小白再次找到老菜. 小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,现在有空完整的说一说吗? 老菜:说到权限系统,要讲明白真不容易,权限系统并不是越复杂 ...

  7. Django REST framework基础:版本控制

    DRF的版本控制 为什么需要版本控制 API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据). DRF提供了许多不同的版本控制方案. 可能会有一些客户端因为某些原因 ...

  8. 【Python 06】汇率兑换1.0-1(IPO与字符串转数字)

    1.案例描述 设计一个汇率换算器程序,功能是将外币换算成人民币. 2.案例分析 将问题划分为输入.处理及输出三部分(IPO) 3.上机实验 rmb_str_value = input('请输入人民币( ...

  9. supervisor 工具 配置

    配置supervisor工具,管理django后台 supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可 ...

  10. ORM相关操作

    1.一般操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs) ...