2019-04-04-day026-模块和包的导入
课前
- 估分
- 重新做题
- 思考为什么
- 积累问题
- 提前了解你的情况 40分以下
- 选课系统
- 按照反射那个版本
- 把反射的逻辑看明白
- 接着把逻辑填完整
- 用上pickle
- logging写日志
- 进阶 : 用软件开发规范
- 按照反射那个版本
内容回顾
异常处理
try:
print('可能会出问题的代码块')
except StopIteration:
print('做一些处理')
except Exception as e:
print('做一些处理',e)
else:
print('上面的代码没有发生异常就执行')
finally:
print('一定要执行的代码')
报错查看方法
- 写代码的时候如果报错:从下至上查看你写的第一行代码
- 在控制台报错的地方最后一行a:b
- a 就是错误类型,b就是具体的错误信息
主动抛异常 raise 错误类型
自定义异常
class 异常名(Exception):
def __init__(self,msg=None):
self.__msg = msg
super().__init__()
def __str__(self):
return self.__msg
断言assert bool值
logging模块
import logging
#简单的配置类型
logging.basicConfig(错误级别,格式,文件)
logging.debug() # print
logging.warning() # print
logger对象(编码问题\灵活度高:能选择输出到文件\屏幕)
logger = logging.getLogger()
做了一系列的绑定
logger.debug() # print
#是不是把所有的print都换logging
今日内容
- 什么是自定义模块
- 为什么要有模块
- 模块和包 : py,包含一堆py文件的文件夹(__init__.py)
- 模块
- 模块的导入相当于执行了整个文件
- 一个模块不能被多次导入,一旦导入原文件中的修改也不会生效
- import 模块名
- 命名空间
- as语法
- 一行导入多个模块
- from 模块名 import 变量名
- 命名空间
- as语法
- 一行导入多个名字
- *语法和__all__
- 模块的搜索路径,sys.path,pycahrm对sys.path进行了修改
- 模块能不能被循环导入,循环导入会导致一些问题
包 - 绝对导入
- 软件的开发规范
模块
- 为什么要有模块?
- 内置的函数是程序运行的时候第一时间就加载到内存
- 各个内置的模块给我们提供的方法都有用
- 但并不是时时刻刻可以用上
- 按照这些所有的方法涉及的方面进行分类
- 相同的功能放在一个模块(就是一个py文件)里
- 就可以存储在硬盘
- 如果我们不导入这个模块中的内容就不会出现在我们的内存中
自定义模块
选课 : 主文件 负责和用户交互 登录 选择操作
- 导入一个模块相当于什么?
- 导入一个模块相当于执行了这个被导入的文件
- 模块的语法,一个模块能不能被多次导入
- 一个模块不会被多次执行
import sys
import my_module
print(sys.modules)
import my_module
import my_module
a = 'alex'
b = 'sb'
my_module.a
my_module.b
my_module.read()
- 导入一个模块的时候命名空间的变化
- 第一:创建了一块属于这个模块的命名空间
- 第二:创建了一个变量 指向这个命名空间
- 第三:执行这个文件
import time,os,random,my_module模块虽然一行可以导入多个,但是不推荐这样使用
as语法,time这个名字就失效的,只剩下t了
import time as t
t.time()
import my_module as m
#用来做兼容
mode = 'pickle'
if mode == 'pickle':
import pickle
else:
import json
def dump():
if mode == 'pickle':
pickle.dump(obj,f)
elif mode == 'json':
json.dump(obj, f)
def load():
if mode == 'pickle':
pickle.load(f)
elif mode == 'json':
json.load(f)
mode = 'pickle'
if mode == 'pickle':
import pickle as mode
else:
import json as mode
def dump():
mode.dump(obj,f)
def load():
mode.load(f)
模块的from_import
from my_module import a,read
a = 'alex'
read()
from my_module import a
print(a)
- 所有的导入
- 不管是import 还是from import
- 都是执行完整的那个被导入的文件
- 并且所有的文件的导入 都不会破坏模块中本身的命名空间
- 如果是import 模块名
- 那么是模块名 指向 整个文件的命名空间
如果是from 模块名 import 变量名 - 那么 是在本文件中创建了同名的变量名 指向模块中的变量值
- 那么是模块名 指向 整个文件的命名空间
- 能不能导入多个变量,并且重命名
from my_module import a,b,read
from my_module import a as aa,b as bb,read as r
print(aa)
print(bb)
print(r)
在写代码的时候 不要起和导入的模块中的函数相同的名字
from random import random as r
def random():
pass
random()
import my_module
a = 'alex'
print(a,my_module.a)
from my_module import a
a = 'alex'
print(a)
from my_module import *
print(a,b,c,d,read)
如果我不知道my_module有什么名字
- 我就会不小心在我的代码中重写这个名字
- 就会把之前的覆盖掉
from my_module import * # __all__ = ['字符串数据类型的变量的名']
print(a)
print(b)
from my_module import read,d
read()
print(d)
模块导入的三个问题
模块的搜索路径
import sys
print(sys.path)
sys.path.append(r'D:\PyCharmProject\s20\day26\demo')
print(sys.path)
import module1
#模块能不能被循环导入
#能不能 在a.py import b
#在b.py import a
#模块一旦被导入 再修改这个模块对应的文件也是不会生效的
import time
import my_module
print(my_module.a)
time.sleep(10)
print(my_module.a)
import sys
print(sys.path)
包的绝对导入
- 什么是包
- 内置的 :也有模块和包之分
- import 包会发生什么
- 相当于执行了这个包中的init文件
- import glance
import导入
import glance.api.policy as policy
policy.get()
#根据包的导入要精确到模块名,不能精确到具体的函数或者变量
#然后使用glance.api.policy或者重命名的方式
#来使用这个模块中的所有名字
from import导入
from glance.api import policy
policy.get()
from glance.api.policy import get
get()
#使用from import import后面至少是精确到模块的
#import后面不能有.
#from后面可以有.,但是.的左边永远是包名
#扩展内容: import一个包 这么包中的内容就都可以用了
import glance
print(glance)
print(glance.api)
print(glance.api.policy)
glance.api.policy.get
glance.api.versions.create_resource('aaa')
glance.db.models.register_models('bbb')
软件的开发规范
--项目名称
# -- bin 一个项目的启动文件装在这个文件夹下
# -- strat.py
# -- conf config配置,配置文件
# -- settings.py 可能会发生改变的配置信息
# -- core 核心代码
# -- 相关文件 实际的python代码所在的文件
# -- user.py
# -- auth.py
# -- main.py
# -- lib 库
# -- db database 数据库 一堆数据文件,不一定是py文件
# -- log 日志
2019-04-04-day026-模块和包的导入的更多相关文章
- python模块与包的导入
1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...
- python模块及包的导入
一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...
- 【Python3之模块及包的导入】
一.模块导入 1.定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
- python之模块、包的导入过程和开发规范
摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...
- DAY16 模块和包的导入
一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...
- Day 16 模块和包的导入
包的认识 包通过文件夹来管理一些列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模块的那个文件地 ...
- Python中模块与包的导入(朴实易懂版的总结)
这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下: 基本注意点 模块:一般指一个py文件:包:含有许多py文件的文件夹,含有 或不含有(Pyth ...
- python的模块与包的导入
类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...
- python 深入模块和包
模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
随机推荐
- 关于Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.的解决方案
Warning: setState(...): Can only update a mounted or mounting component. This usually means you call ...
- php并发
bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...
- SQL 经典回顾:JOIN 表连接操作不完全指南
2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...
- nop 4.1 Widget 探究- 视图组件
1. 系统默认自带了一个NivoSlider 的Wdget. 在Nop.Web项目首页的HomePageTop里 这个写法是 ASP.NET Core MVC 中的新特性 视图组件,与局部视图相似,但 ...
- 批量生成QRcode
本想在excel批量生成GUID,并生成二维码. //Excel生成guid,uuid 格式:600d65bc-948a---fd8dfeebb1cd =LOWER(CONCATENATE(DEC2H ...
- 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel
迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...
- linux network
Linux 1◆ 提供连接 2◆ connection baidu.com 3◆ vm tools install Reboot
- js之单例
所谓单例,指的是只有一个实例的对象. js通过对象字面量的方式来创建单例对象. var sig = { name:value, method:function(){ } }
- vue项目如何打包前后端不分离发布手把手教学apache、nginx
vue项目如何不分离发布 1.首先yarn build 我用了vue-cli脚手架,bulid后的dist文件夹里的index.html有加版本号,那么为什么需要加版本号呢? a.回滚 b.解决浏览器 ...
- 请问微信小程序let和var以及const有什么区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...