解耦 = 解除耦合
未解除耦合例子
解除耦合例子
问 : 帐号信息在db里为什么要分成一个一个的文件,而不把所有的帐号都放在一个文件里?
答 : 由于A用户正在操作文件,B用户若也操作文件的话,B读到的实际上是个旧文件,当B又保存的时候,就没有把A已经更新的文件保存下去
问 : 如何对登录状态进行校验
哒: 设置个全局变量字典保存用户的个人信息,登录状态,登录成功后可以把信息返回给这个内存变量,给状态置位。
1.定义:
模块:本质就是.py结尾的python文件,用来从逻辑上组织python代码(变量、函数、类、逻辑 : 模块的本质就是实现一个功能)
2.导入方法
import moduel_name
import moduel_name1,modeul_name2
from moduel_name imoprt * (不建议这么使用)
因为当A和B存在相同的function名的时候,会有冲突
from module_alex import logger as log 因为方法使用了别名,所以就不会出现冲突的情况
3.import本质
本质就是把python文件解释一遍
包 :用来从逻辑上组织模块,本质就是一个目录,带一个__init__.py的文件(必须带)
导入包的本质就是执行该包下的__init__.py文件
需要先在sys这个list中把绝对路径加进去
获取绝对路径的话用 os.path.dirname(os.path.abspath(__file__))
import os, sys
#文件的路径
fliename = os.path.abspath(__file__)
print (fliename)
#文件的目录
dir_name = os.path.dirname(fliename)
print (dir_name)
#文件目录的目录
top_dir_name = os.path.dirname(dir_name)
print (top_dir_name)
#添加环境变量
sys.path.append(top_dir_name)
C:UserszouyiPycharmProjectspython_classpythonDay_05studystudy1.py
C:UserszouyiPycharmProjectspython_classpythonDay_05study
C:UserszouyiPycharmProjectspython_classpythonDay_05
4.导入优化
就是通过from直接引用
from . import test as ffff
5.模块的分类
a : 标准库
b : 开源模块
c : 自定义模块
标准库
1. time 和 datetime
import time
time.localtime #本地当前时间是个元祖
import time
import datetime
#标准时间
print (time.gmtime())
#localtime
print (time.localtime())
#time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=8, tm_wday=3, tm_yday=1, tm_isdst=0)
#取时间年份
s = time.localtime().tm_year
print (s)
time.struct_time(tm_year=2016, tm_mon=8, tm_mday=20, tm_hour=14, tm_min=35, tm_sec=15, tm_wday=5, tm_yday=233, tm_isdst=0)
2016
#元祖转换成时间戳
time.mktime(s)
12312313123
#格式化时间
date_value = time.strftime("%Y-%m-%d %H:%M:%S")
print (date_value)
2016-08-20 14:40:54
datetime模块
import datetime
#获取当前的时间
print (datetime.datetime.now())
#获取三天后的时间
print (datetime.datetime.now()+datetime.timedelta(3))
2016-08-20 15:07:25.001953
2016-08-23 15:07:25.001953
#获取3小时后的时间
print (datetime.datetime.now()+datetime.timedelta(hours = 3))
%
a 本地(locale)简化星期名称
%
A 本地完整星期名称
%
b 本地简化月份名称
%
B 本地完整月份名称
%
c 本地相应的日期和时间表示
%
d 一个月中的第几天(
01
-
31
)
%
H 一天中的第几个小时(
24
小时制,
00
-
23
)
%
I 第几个小时(
12
小时制,
01
-
12
)
%
j 一年中的第几天(
001
-
366
)
%
m 月份(
01
-
12
)
%
M 分钟数(
00
-
59
)
%
p 本地am或者pm的相应符 一
%
S 秒(
01
-
61
) 二
%
U 一年中的星期数。(
00
-
53
星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第
0
周。 三
%
w 一个星期中的第几天(
0
-
6
,
0
是星期天) 三
%
W 和
%
U基本相同,不同的是
%
W以星期一为一个星期的开始。
%
x 本地相应日期
%
X 本地相应时间
%
y 去掉世纪的年份(
00
-
99
)
%
Y 完整的年份
%
Z 时区的名字(如果不存在为空字符)
%
%
‘
%
’字符
random模块
import random
#取随机数字串
random.randint(1,3) #顾尾
random.randrange(1,5) #顾头不顾尾
#去随机字符串
random.choice("zouyi") #序列,字符串,中取一个值
random.choice("[1,2,3,4,5]")
#洗牌功能
items = [1,2,3,4,5]
random.shuffle(items)
[1,4,5,2,3]
#取所有字符和数字
import string
checkcode = string.ascii_letters + string.digits
print (checkcode)
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
#随机取数字
str_1 = string.ascii_letters + string.digits
code = random.sample(str_1,5)
code = "".join(code)
print (code)
m = "".join(random.sample(string.ascii_letters+string.digits,4))
print (m)
os模块
#获取当前路径
os.getcwd()
#切换目录
os.chdir(r"c:/")
#递归创建目录
os.makedirs(r"c:/a/b/c/d/")
#递归删除目录
os.removedirs(r"c:/a/b/c/d/")
#展示都有什么文件
os.listdir(r"d:/")
#路径和文件分割
os.path.splite(r"c:/a/b/c/1.txt")
("c:/a/b/c/","1.txt")
#取目录
os.path.basedirname("c:/a/b/c/1.txt")
c:/a/b/c
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(
"dirname"
) 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (
'.'
)
os.pardir 获取当前目录的父目录字符串名:(
'..'
)
os.makedirs(
'dirname1/dirname2'
) 可生成多层递归目录
os.removedirs(
'dirname1'
) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(
'dirname'
) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(
'dirname'
) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(
'dirname'
) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename(
"oldname"
,
"newname"
) 重命名文件
/
目录
os.stat(
'path/filename'
) 获取文件
/
目录信息
os.sep 输出操作系统特定的路径分隔符,win下为
"\",Linux下为"
/
"
os.linesep 输出当前平台使用的行终止符,win下为
"
"
,Linux下为
"
"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win
-
>
'nt'
; Linux
-
>
'posix'
os.system(
"bash command"
) 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回
True
;如果path不存在,返回
False
os.path.isabs(path) 如果path是绝对路径,返回
True
os.path.isfile(path) 如果path是一个存在的文件,返回
True
。否则返回
False
os.path.isdir(path) 如果path是一个存在的目录,则返回
True
。否则返回
False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
configparser模块
用来生成配置文件
生成配置
import
configparser
config
=
configparser.ConfigParser()
config[
"DEFAULT"
]
=
{
'ServerAliveInterval'
:
'45'
,
'Compression'
:
'yes'
,
'CompressionLevel'
:
'9'
}
config[
'bitbucket.org'
]
=
{}
config[
'bitbucket.org'
][
'User'
]
=
'hg'
config[
'topsecret.server.com'
]
=
{}
topsecret
=
config[
'topsecret.server.com'
]
topsecret[
'Host Port'
]
=
'50022'
# mutates the parser
topsecret[
'ForwardX11'
]
=
'no'
# same here
config[
'DEFAULT'
][
'ForwardX11'
]
=
'yes'
with
open
(
'example.ini'
,
'w'
) as configfile:
config.write(configfile)
读取配置
import configparser
conf = configparser.ConfigParser90
config.sections()
config.read()
print (config.['bitbucket.org'])
hashlib模块
import hashlib
m = hashlib.md5()
m.update(b"hello")
print (m.hexdigest()) #十六进制生成
m.update(b"it me")
print (m.hexdigest())
m.update(b"sssssss") #update是把上一个给增加上去了,也就是hello和hexdigest
print (m.hexdigest())
hmac消息加密
h = hmac.new(b"123","test content中文".encode(encoding="utf-8"))
print (h.hexdigest())
正则模块
'.' 默认匹配任意字符(除换行)
'+' 匹配一次换多次
re.search('a.+',"abcdef")
'?' 匹配0次或1次 匹配前一个"字符"一次或0次
re.search("aaa?","aalexaaa")
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
#findall没有group方法
re.splitall 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
正则字典模式
正则替换sub