课前

  1. 估分

    • 重新做题
    • 思考为什么
    • 积累问题
    • 提前了解你的情况 40分以下
  2. 选课系统
    • 按照反射那个版本

      • 把反射的逻辑看明白
    • 接着把逻辑填完整
    • 用上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

今日内容

  1. 什么是自定义模块
  2. 为什么要有模块
  3. 模块和包 : py,包含一堆py文件的文件夹(__init__.py)
  4. 模块
    • 模块的导入相当于执行了整个文件
    • 一个模块不能被多次导入,一旦导入原文件中的修改也不会生效
    • import 模块名
      • 命名空间
      • as语法
      • 一行导入多个模块
    • from 模块名 import 变量名
      • 命名空间
      • as语法
      • 一行导入多个名字
      • *语法和__all__
    • 模块的搜索路径,sys.path,pycahrm对sys.path进行了修改
    • 模块能不能被循环导入,循环导入会导致一些问题
    • 绝对导入
  5. 软件的开发规范

模块

  • 为什么要有模块?
  • 内置的函数是程序运行的时候第一时间就加载到内存
  • 各个内置的模块给我们提供的方法都有用
  • 但并不是时时刻刻可以用上
  • 按照这些所有的方法涉及的方面进行分类
  • 相同的功能放在一个模块(就是一个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()
  • 导入一个模块的时候命名空间的变化

    1. 第一:创建了一块属于这个模块的命名空间
    2. 第二:创建了一个变量 指向这个命名空间
    3. 第三:执行这个文件

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-模块和包的导入的更多相关文章

  1. python模块与包的导入

    1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...

  2. python模块及包的导入

    一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...

  3. 【Python3之模块及包的导入】

    一.模块导入 1.定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  4. python之模块、包的导入过程和开发规范

    摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...

  5. DAY16 模块和包的导入

    一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...

  6. Day 16 模块和包的导入

    包的认识 包通过文件夹来管理一些列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模块的那个文件地 ...

  7. Python中模块与包的导入(朴实易懂版的总结)

    这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下: 基本注意点 模块:一般指一个py文件:包:含有许多py文件的文件夹,含有 或不含有(Pyth ...

  8. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  9. python 深入模块和包

    模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...

  10. 【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

随机推荐

  1. 关于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 ...

  2. php并发

    bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件指针.o ...

  3. SQL 经典回顾:JOIN 表连接操作不完全指南

    ​   2017-02-23 小峰 ITPUB 点击上方“蓝字”可以关注我们哦  |转载自:码农网 |原文链接:www.codeceo.com/article/sql-join-guide.html ...

  4. nop 4.1 Widget 探究- 视图组件

    1. 系统默认自带了一个NivoSlider 的Wdget. 在Nop.Web项目首页的HomePageTop里 这个写法是 ASP.NET Core MVC 中的新特性 视图组件,与局部视图相似,但 ...

  5. 批量生成QRcode

    本想在excel批量生成GUID,并生成二维码. //Excel生成guid,uuid 格式:600d65bc-948a---fd8dfeebb1cd =LOWER(CONCATENATE(DEC2H ...

  6. 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel

    迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...

  7. linux network

    Linux 1◆ 提供连接     2◆ connection baidu.com 3◆ vm tools install Reboot    

  8. js之单例

    所谓单例,指的是只有一个实例的对象. js通过对象字面量的方式来创建单例对象. var sig = { name:value, method:function(){ } }

  9. vue项目如何打包前后端不分离发布手把手教学apache、nginx

    vue项目如何不分离发布 1.首先yarn build 我用了vue-cli脚手架,bulid后的dist文件夹里的index.html有加版本号,那么为什么需要加版本号呢? a.回滚 b.解决浏览器 ...

  10. 请问微信小程序let和var以及const有什么区别

    在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...