day18 包

day18 包

今日内容

  • 包 – 管理模块 – 具有__init__.py文件的文件夹就是包

昨日内容回顾

  1. 正则

    1. 元字符

      元字符匹配规则
      \w一个字母、数字或下划线
      \w+一个或多个字母、数字或下划线
      \d一个数字
      \d+一个或多个数字
      \S一个非空白字符(数字、字母、下划线或特殊符号)
      ^从开头匹配
      $从结尾匹配
      .匹配任意除换行符之外的字符
      *匹配0个或多个左侧的字符,贪婪匹配
      +匹配1个或多个左侧的字符,贪婪匹配
      匹配0个或1个左侧的字符,非贪婪匹配
      e{2}匹配2个e
      e{1,6}匹配1到6个e,贪婪匹配
      |
      ()分组,括号外的不保留
      (??分组,保留括号外的
      \.能够将匹配任意字符的点转译成普通的点
      [0-9a-zA-z]范围内的数字字母,主要参照ascii码表
      [^0-9]不要数字0-9
      \w+?将贪婪匹配变成非贪婪匹配
    2. 常用方法

      1. findall(),获取所有匹配到的内容,返回的是一个列表
      2. sub(),替换
      3. split(),分割
      4. compile(),定义规则
      5. finditer(),返回一个迭代器,迭代后得到的结果需要用group方法查看
      6. search(),从字符串中任意位置匹配,找到一个就停止,找不到返回None
      7. match(),从字符串开头进行匹配,如果不是要匹配的内容,就不继续匹配
  2. logging

    1. 基础版
      1. 编码不能修改
      2. 屏幕和文件只能有一个输出方式
    2. 进阶版 – 二次开发
      1. 先创建一个空对象
      2. 创建一个文件句柄
      3. 创建一个中控台局部
      4. 设置一个记录日志的格式
      5. 将记录日志的格式和文件句以及中控台进行绑定
      6. 将文件句柄及中控台句柄添加到空对象中
      7. 记录日常信息
      8. 记录程序错误

今日内容详细

包的定义:具有__init__.py文件的文件夹就是一个包。

包的目的是用来管理模块。

包的本质就是一个模块。模块可以导入,包也可以导入。

在Python 2中,使用import导入一个包,如果包中没有__init__.py文件,会报错;

在Python 3中,使用import导入一个包,如果包中没有__init__.py文件,不会报错,但也无法正常使用。

在导入时只要使用点操作,就是在导入包。导入时,.前面的必须是一个包。

我们在项目的根目录PyProject下建立一个名为bake的包,然后按照下面的目录树创建包和py文件:

----bake\
    |----api\
    |    |----policy.py
    |    |----versions.py
    |    |----__init__.py
    |----cmd\
    |    |----manage.py
    |    |----__init__.py
    |----db\
    |    |----models.py
    |    |----__init__.py
    |----file_tree.py
    |----test.py
    |----__init__.py

创建完成后是这个样子的。需要注意的是,bake文件夹一定要直接放在项目的根目录PyProject下,否则接下来的导入过程可能会出问题。

1570240125350

在文件policy.py中写入代码:

name = 'alex'
print('api_policy')

在文件versions.py中写入代码:

name = 'meet'
print('api_versions')

在文件manage.py中写入代码:

neme = 'taibai'
print('cmd_manage')

也就是这个样子:

1570252115626

导入包可以使用相对路径和绝对路径两种方法:
绝对路径:bake1.api.policy从最外层的开始查找
相对路径:取决于在哪个文件中启动,.代表当前目录

导入包的方式最基本的结构为:

import..模块

比如,我们想在test.py文件中导入version模块,并使用其中的name变量:

import bake.api.versions
print(bake.api.versions.name)

输出的结果为:
api_versions
meet

我们成功导入了包,也成功调用了包中的变量。但是每次使用的时候都要使用长长的绝对路径,十分麻烦。这时,我们可以给导入的包取一个别名,来方便调用:

import bake.api.policy as p
print(p.name)

输出的结果为:
api_policy
alex

我们也可以通过from方法来导入包中指定的函数或变量,而不是将包整体导入。其基本结构为:

from..模块 import 函数,变量,*

比如,我们要导入模块manage中的变量name,就可以这样:

from bake.cmd.manage import name
print(name)

输出的结果为:
cmd_manage
taibai

我们说过,包的本质也是模块,但是如果我们直接导入包,却发现无法直接调用其中的模块中的变量:

from bake import api
print(api.policy.name)

程序报错,报错信息为:
Traceback (most recent call last):
  File "C:/Users/Sure/PyProject/bake/test.py", line 21, in <module>
    print(api.policy.name)
AttributeError: module 'bake.api' has no attribute 'policy'

这是因为我们没有指明api包所需要导入的文件。这时,我们就要在api包下的__init__.py文件中指明导入的文件:

from .policy import *

这样,程序就可以顺利运行啦。

如果我们直接在test文件中导入bake中的所有模块中的函数和变量,就可以这样:

from bake import *
print(name)

输出的结果为:
api_policy
api_versions
cmd_manage
taibai

因为变量名都命名为name,相互覆盖之后,只剩下了taibai。

总结一下,当程序运行到from bake import *命令时,一共经历两个步骤:

  1. 现在bake的__init__.py中导入bake下的所有的包
  2. 在bake下的所有包中的__init__.py中导入每个包下的模块

模块与包的关系为:

  • 模块 - 软件开发规范 - 包

  • 按照软件开发规范创建包,包中存放模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值