本文目录:
一、常用模块
1.模块 的用用法
模块的相互导入 绝对导入 从sys.path (项目根目录)开始的完整路径
相对导入 是指相对于当前正在执行的文件开始的路径 只能用于包内模块相互间导入
不能超过顶层包
2.常用模块
该用装饰器(如果你的日志没有什么特别的自定义消息 msg 仅仅是输出一些调试信息)
还是直接调对应的 周五的
坑1 我们想使用不同配置 写了两个配置文件
重新加载配置 调用getLogger(__file__)
我们意淫 只要改了配置就能得到新的日志生成器
其实 系统如果发现你需要的生成器以及被创建过 就不会再创建新的生成器
我们在调用getLogger的时候 如果你要分别将日志输出到不同位置 应该创建两个不同的生成器
而不是 去修改同一个的配置 坑2
需要将getLogger 返回的生成器 设置全局变量 否则只能输出一次 使用logging的步骤
1.编写配置文件
格式可能需要修改
handlers中 输出的位置需要修改
loggers 中可能有不同的生成器
2.加载配置 获取生成器 (一次即可)
3.直接输出日志 info debug....
logging模块
标签格式
<标签名 属性名="值">文本</标签名>
1.必须有且只能有一个根标签
2.属性名不用双引号 而 值必须要
3.双标签 必须有结束标签
4.单标签格式:<标签名/> 只能有属性 解析
1.加载文件 t = xml.etree.ElementTree.parse(文件名)
2.获取根标签 root = t.getroot()
3.三种方式获取要的标签
root.iter(标签名) 全文查找所有名称匹配的
root.find(标签名) 在子级中查找第一个名称匹配的
root.findall(标签名) 在子级中查找所有名称匹配的
4.获取详细内容
e = 一个标签
e.text 获取文本
e.tag 标签名
e.attrib 属性字典
e.get(属性名) 某个属性的值 用代码生成xml 或修改 基本不用
步骤 先创建新标签 设置相关的内容和属性 添加父标签中 写入文件
xml模块
json是跨平台的数据格式 全称js的对象表示方式
书写格式 必须按照js要求的来
js支持的类型
{}
[]
""
int/float
true/flase
null 最外层通常是字典
{"name":"矮根","gender":"male","age":68}
key 必须双引号括起来 值如果是字符串也必须双引号 读取(反序列化):
json.load(文件对象)
json.loads("字符串")
返回python数据类型 写入(序列化):
json.dump(要序列化的对象,文件对象)
json.dumps(要序列化的对象) 返回json字符串
写web项目时 你要用python到数据库中拿数据 然后搞成json格式发给 前台
json模块
# 其他模块#shutil模块 高级的文件操作 压缩 复制 粘贴
#os模块 操作系统相关 文件相关
path 路径处理
#sys模块
解释器相关 sys.path sys.modules
编写命令行程序时 sys.argv获取参数 #pickle python独有的序列化
re
正则表达式 对字符串进行 匹配(常用) 查找(常用) 替换操作
位置匹配
范围匹配
单个字符
精准匹配
重复匹配 + * ? {a,b}
贪婪匹配 尽可能多取 +1-无穷 *0-无穷
坑点 .任意非换行 .*这个表达式没有任何意义 所以返回结果如何 没必要看
非贪婪匹配(常用) 尽可能少取 ? 0-1
表达式后面加上? 变为非贪婪 分组 默认返回第0组 \w+(\s+)abc
findall 查找全文中所有匹配的内容 返回第1组
mathch 从开头开始匹配 用group指定要取的组号
search 查找全文中第一个匹配的内容 项目中? 爬虫 用户输入验证 #time
#shevle python独有 轻量级序列号方式 相当于一个自带持久化效果的字典 #random 随机数
#hashlib hash算法 用于 加密 完整校验
configparser
解析配置文件
xxx.xfg
section
option
getoptions
getsection
set(section,option,value)
removesection
write(文件名)
#subprocess
子进程 当你的程序需要与系统的cmd交互时
用管道来进行通讯 errout stdout stdin
二、面向对象总结
面向对象
面向过程的使用场景:一些对扩展性要求不高的程序系统内核,shell脚本
面向对象的使用场景:常见的web开发 爬虫开发 数据分析等 对扩展性要求比较高 类和对象
对象是什么? 特征和技能的结合体 (万物皆对象)
类是什么? 一系列具备相同特征和技能的对象的 抽象概念 现实生活中 先有对象再有类
程序中 先有类 再有对象 使用OOP来编写程序时
1.首先思考完成任务需要哪些对象参与
2.在思考这些对象有什么要的特征和技能
3.编写class
4.按照需求 添加特征和行为
5.实例化对象
6.使用对象完成任务 三大特征
封装
什么意思? 将内部复杂内容进行隐藏 只提供一个简单的使用接口
本质上就是影藏一部分内容 使外界无法直接访问 只能通过提供的接口来访问
为什么要封装
对于开发者 作用对数据的访问加以限制 提高安全性
对于使用者而言 简化了操作 如何封装
属性前签上__两个下划线
pwd = 123
__pwd = 123 __的本质是 语法级别上变形(在语法检测期间) _类名__属性名
这么一来 我么完全可以绕过语法限制 继承
1.什么是继承
继承与现实生活中的继承一个意思 例如 小明继承小明他爹财产 房子
一个东西b继承了另一个东西a b就拥有a的内容
在代码中
一个类b继承了另一个类a b这个类 就拥有了a中所有属性
作用:
可以减少代码冗余 2.使用场景:
例如: 你的项目中需要两种对象 老师和学生
分析发现 老师和学生有很多相似之处 都有 姓名 性别 年龄
将相同的部分属性 抽取到一个共同父类中person
3.写法:
class Person:
共有的属性
name
age
gender
def sleep():
print(大家都需要睡觉 睡觉的过程也相同) def attendClass():
print("听到上课铃声 要去教室") 4.派生:
分析:
学生和老师 有相同的功能叫上课
然而上课这个操作 学生和老师只有部分相同
可以把相同的部分 抽取到父类中
这样一来 学生就可以直接拥有父类中的上课方法 但是 实现方式与父类中有所不同
此时我们可以直接覆盖父类中的函数 这样一来 学生类称之为person类的派生类
总结:
结合上课讲到的属性的派生,总的来说 只要子类中东西和父类不同 就成为派生类
派生的案例:
继承自Person
class Student(Person):
学号(子类特有的)
# 上课
def attendClass():
super().attendClass()
print("听课")
继承自Person
class Teacher(Person):
工资(子类特有的) def attendClass():
super().attendClass()
print("讲课") 5.super 是创建了一个特殊对象,专门用于访问父类提供的属性
class Person: def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender class Student(Person):
# 学生有学号
def __init__(self,name,age,gender,number): # 1.指名道姓找到父类的函数
Person.__init__(self,name,age,gender)
# 2.创建特殊对象调用
super().__init__(name,age,gender)
self.number = number 6.单继承和的多继承
7.多继承中的查找顺序 mro python2中 需要手动指定Object作为父类 它就成为了新式类
python3中 默认就继承Object 不需要手写 多态
组合 装饰器:
property
classmethod
staticmethod 类内置方法
__str__ 打印对象时返回的字符串
__del__ 删除对象前执行 一些清理操作 反射
以字符串的方式 对对象中的属性进增删改查