一、面向对象综合
1.pickle持久化
open–>read/write----->close:操作的是文本【字符串和二进制数据】
pickle:操作对象
代码演示:
import pickle """ pickle提供了一个简单的持久化功能,可以将对象以文本的形式存储到本地磁盘上 pickle模块只能在Python中使用,Python中的所有的数据类型【list,tuple,dict,set,string,对象】 都可以通过pickle持久化到磁盘上 注意:通过pickle序列化之后的数据,人一般无法识别 """ class Person(object): def __init__(self,name,age): self.name = name self.age = age def show(self): print("姓名:%s 年龄:%d" % (self.name,self.age)) #创建对象 p = Person("张三",18) p.show() #1.序列化:将对象存储到本地磁盘【对象的本地持久化】,write """ pickle.dump(obj,file) obj:将要封装的对象【将要写入磁盘的对象】 file:obj将要写入的文件对象,注意:file必须以二进制的方式打开,flag使用"wb" """ #1.1打开文件 #注意:类似于write的用法,当文件不存在是,也会自动创建 file1 = open("file1.txt","wb") #1.2写入内容 pickle.dump(p,file1) #1.3关闭文件 file1.close() #2.反序列化:将本地磁盘上的对象读取出来,read """ pickle.load(file) file:要读取的文件对象,注意:file必须以二进制的方式打开,flag使用"rb" """ #2.1打开文件 file2 = open("file1.txt","rb") #2.2读取【加载】 result = pickle.load(file2) print(result) print(type(result)) result.show() #2.3关闭文件 file2.close()
2.购物车功能
商品类
""" 商品类: 商品名称 商品价格 商品剩余量 """ class Goods(object): def __init__(self,name,price,balance): self.name = name self.price = price self.balance = balance def __str__(self): return "【goods】name:%s price:%d balance:%d" % (self.name,self.price,self.balance)
用户类
""" 用户类: 姓名 用户id【这个标识对于每个用户而言是唯一的]】 密码 用户的购物车 用户登录状态【默认为 False 表示没有登录】 """ class User(object): def __init__(self,name,uid,psw,shoppingcar): self.name = name self.uid = uid self.psw = psw self.shoppingcar = shoppingcar #登录状态:默认为 False 表示没有登录 self.islogin = False def __str__(self): return "【user】name:%s uid:%s psw:%s shoppingcar:%s islogin:%s" % (self.name,self.uid,self.psw,self.shoppingcar,self.islogin)
仓库类
import os from shopcar.goods import Goods import pickle """ 仓库类:【信息保存在本地磁盘:程序刚启动时把列表先存储到文件中,之后使用再读取出来】 商品列表 商品名称 价格 剩余量 Mac电脑 20000 100 PthonBook 30 200 草莓键盘 80 60 iPhone 7000 70 """ #只要是一个类,就可以任意的创建对象,但是,代码运行的过程中,仓库只有一个,而且是唯一的,为了避免可以任意的创建仓库对象 #将仓库类设置为单例类,这样做就可以保证不管在代码的哪个地方获取仓库对象,获取到的都是同一个 #使用装饰器实现单例类 def single(cls): #方式一:变量 """ instance = None #函数作用域 def getInstance(*args,**kwargs): nonlocal instance if instance == None: instance = cls(*args,**kwargs) return instance """ #方式二:字典 instance = {} def getInstance(*args, **kwargs): if cls not in instance: instance[cls] = cls(*args,**kwargs) return instance[cls] return getInstance @single class Storage(object): def __init__(self): #程序刚启动时把列表先存储到文件中,之后使用再读取出来 self.init_goods() #加载商品 def init_goods(self): #假设:存储仓库中商品的文件命名goodslist.txt if not os.path.exists("goodslist.txt"): #定义一个列表,用于保存商品信息 self.goodsList = [] #商品的模拟 names = ["Mac电脑","PythonBook","草莓键盘","iPhone"] prices = [10000,78,550,6600] balances = [100,80,46,29] #遍历列表 for i in range(len(names)): #根据已知的信息创建商品的对象 goods = Goods(names[i],prices[i],balances[i]) #将创建好的商品对象保存到商品列表中 self.goodsList.append(goods) #将商品列表持久化到磁盘上 self.save_goods() else: #加载文件中的商品 self.load_goods() #将商品列表持久化到磁盘上 def save_goods(self): with open("goodslist.txt","wb") as f: pickle.dump(self.goodsList,f) #将商品列表从磁盘上读取出来 def load_goods(self): with open("goodslist.txt", "rb") as f: #注意:时刻保证程序中的商品列表和本地文件中的商品列表中的信息保持一致 self.goodsList = pickle.load(f) #获取文件中的商品列表 def get_goods(self): if os.path.exists("goodslist.txt"): self.load_goods()
购物车类
""" 购物车类: 商品列表:程序初始时,商品列表为空 """ class ShoppingCar(object): def __init__(self): #程序初始时,商品列表为空 self.shop_goodslist = {} def __str__(self): return "【购物车】商品列表:%s" % (self.shop_goodslist)
功能类
from shopcar.goods import Goods from shopcar.user import User from shopcar.shoppingcar import ShoppingCar from shopcar.storage import Storage import os,pickle,random class Operation(object): #当程序启动之后,加载本地用户文件 def __init__(self): self.init_user() #加载所有的用户 #假设:存储所有用户的文件命名为user.txt def init_user(self): if not os.path.exists("user.txt"): #将用户添加在字典中 """ key:用户id 【用户id随机产生即可,从10000~99999中随机产生一个】 value:对应的用户对象 """ self.userlist = {} else: self.load_users() #加载本地文件中的字典 def load_users(self): with open("user.txt","rb") as f: self.userlist = pickle.load(f) #保存用户信息 def save_users(self): with open("user.txt","wb") as f: pickle.dump(self.userlist,f) #随机产生一个用户id def get_uid(self): while True: # 用户id随机产生即可,从10000~99999中随机产生一个 uid = str(random.choice(range(10000, 100000))) # 问题:用户id是为了唯一标识用户,可能会出现重复的情况 if uid not in self.userlist: return uid print("用户id已经存在,请重新获取") #注册用户 """ 用户注册——》根据下面信息生成一个用户,并将用户保存在本地 随机产生 id 输入姓名和密码 创建一个购物车对象 """ def user_register(self): #获取uid uid = self.get_uid() print("你的用户id是:%s" % (uid)) #创建购物车对象 sc = ShoppingCar() #姓名和密码 name = input("请输入姓名:") psw = input("请输入密码:") #根据已知的信息创建一个用户对象 user = User(name,uid,psw,sc) #将用户添加到字典中 self.userlist[uid] = user #将用户同步到本地文件中 self.save_users() #用户登录 """ 登录 ——》 登录成功返回为 True 否则返回为 False 输入用户id 检测是否有该用户 没有的话提示注册 有的话检测用户登录状态 若为 True 提示已登录 否则 再输入密码进行登录 不要忘记修改用户的登录状态 """ def user_login(self): uid = input("请输入用户id:") #检测是否有该用户 没有的话提示注册 if uid not in self.userlist: print("还未注册,请先注册") #self.user_register() return #说明用户已经注册过 #获取已经注册过的用户对象 user = self.userlist[uid] #判断登录状态,如果已经登录过,则直接返回用户对象 if user.islogin: return user #如果未登录过,则需要进行登录 psw = input("请输入登录密码:") if psw == user.psw: print("登录成功") #将用户的登录状态改为True user.islogin = True return user else: print("请输入正确的登录密码") #购买商品:向购物车中添加商品 #向购物车中添加商品,同时,仓库中的商品数量减少 """ 购买商品 ——》验证用户是否登录,没有登录提示登录 否则 列出仓库中商品名单 1. Mac电脑 2.PthonBook 3.草莓键盘 4.iPhone 用户输入对应的编号 在仓库中获得对应的商品 用户输入数量 — 与该商品的的剩余量对比 > 剩余量 让用户重新输入并提示该商品的剩余量 <=剩余量 将该商品添加在该用户的购物车中 并将仓库中的数据量做出相应的减少 注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性 """ def add_goods(self): user = self.user_login() if user == None: print("请先登录:") return #说明用户已经登录 print(""" 0. Mac电脑 1.PthonBook 2.草莓键盘 3.iPhone """) #引导用户选择商品 index = int(input("请输入需要购买的商品编号:")) #获取仓库对象 storage = Storage() #从仓库的商品列表中通过用户选择的商品编号获取商品 goods = storage.goodsList[index] #引导用户输入需要购买的商品的数量 num = int(input("请输入需要购买的数量;")) if num < 0: print("输入有误") else: while num > goods.balance: num = int(input("商品剩余量:%d,请重新输入需要购买的商品数量:" % (goods.balance))) else: #重新实例化商品对象 user_goods = Goods(goods.name,goods.price,num) #将购买好的商品添加到用户的购物车中 #用户的购物车的商品列表:商品对象作为key,购买的数量作为value user.shoppingcar.shop_goodslist[user_goods] = num #仓库中的对应的商品数量减少 goods.balance -= num #数据发生改变,同步数据到本地文件 #更新用户信息 self.save_users() #更新仓库信息 storage.save_goods() #删除购物车中的商品 """ 删除购物车的商品——》验证用户是否登录,没有登录提示登录 否则 请用户输入商品名字 查看该用户的购物车中是否有该商品 如果没有,提示购物车中没有该商品 否则: 先选择要删除的商品 请用户设置删除的数量 数量 >= 购物车中商品数量 购物车清单中删除该商品 否则: 购物车清单中做出相应的减少 注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性 """ def del_goods(self): #判断是否登录 user = self.user_login() if user == None: print("还未登录,请先登录") return #说明登录成功 g_name = input("请输入要删除的商品名称:") #定义一个变量,用于获取商品对象 goods = None #定义一个变量,用于标记该商品是否存在 flag = False #默认不存在 #遍历用户购物车的商品列表 #商品列表实质上是一个字典,商品对象作为key,数量作为value for key in user.shoppingcar.shop_goodslist: if key.name == g_name: flag = True goods = key #根据flag的值判断商品是否存在 if not flag: print("商品不存在") return #操作仓库 #在仓库中获取该商品 storage = Storage() #定义一个变量,用于记录需要被删除的商品在仓库中的位置 index = 0 for i in range(len(storage.goodsList)): if storage.goodsList[i].name == g_name: index = i #根据商品在仓库中的位置获取对应的商品对象 storage_goods = storage.goodsList[index] #引导用户输入需要删除的商品的数量 num = int(input("请输入需要删除的商品的数量;")) #全部删除 if num >= goods.balance: # 在仓库中添加 storage_goods.balance += goods.balance #将该用户对应的商品全部删除 user.shoppingcar.shop_goodslist.pop(goods) #删除部分 else: goods.balance -= num #将购物车中的商品数量做更改 user.shoppingcar.shop_goodslist[goods] = goods.balance # 在仓库中添加 storage_goods.balance += num #同步数据到本地文件 self.save_users() storage.save_goods() #结算购物车 """ 结算——》验证用户是否登录 没有登录提示登录 否则 获取该用户的购物车中商品清单,计算总额 注意: 结算完成 购物车清空 将修改之后的结果同步在本地文件中,时刻保持数据的正确性 """ def account_goods(self): # 判断是否登录 user = self.user_login() if user == None: print("还未登录,请先登录") return #获取购物车中的所有的商品 goods_dict = user.shoppingcar.shop_goodslist #计算所有商品的总价格 total = 0 for goods,num in goods_dict.items(): total += goods.price * num print("购物车中的商品总价值为:%d" % (total)) #清空购物车 goods_dict.clear() #同步数据到本地文件中 self.save_users() #退出登录 """ 退出登录———》验证用户是否登录 没有登录提示登录 否则 修改用户登录状态 注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性 """ def user_quit(self): # 判断是否登录 user = self.user_login() if user != None: #修改用户的登录状态为False user.islogin = False #同步用户数据到本地文件中 self.save_users()
测试文件
from shopcar.operation import Operation def main(): #启动程序,创建OPeration的对象 op = Operation() while True: print("1.注册 2.登录 3.购买 4.删除 5.结算 6.退出") select = int(input("请输入选择:")) if select == 1: op.user_register() elif select == 2: op.user_login() elif select == 3: op.add_goods() elif select == 4: op.del_goods() elif select == 5: op.account_goods() elif select == 6: op.user_quit() else: print("输入有误") break if __name__ == "__main__": main()
二、发邮件和发短信
1.发短信
互亿无限
代码演示:
# 接口类型:互亿无线触发短信接口,支持发送验证码短信、订单通知短信等。 # 账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html # 注意事项: # (1)调试期间,请用默认的模板进行测试,默认模板详见接口文档; # (2)请使用APIID(查看APIID请登录用户中心->验证码短信->产品总览->APIID)及 APIkey来调用接口; # (3)该代码仅供接入互亿无线短信接口参考使用,客户可根据实际需要自行编写; # !/usr/local/bin/python # -*- coding:utf-8 -*- import http.client import urllib host = "106.ihuyi.com" sms_send_uri = "/webservice/sms.php?method=Submit" # 用户名是登录用户中心->验证码短信->产品总览->APIID account = "用户名" # 密码 查看密码请登录用户中心->验证码短信->产品总览->APIKEY password = "密码" def send_sms(text, mobile): params = urllib.urparselencode( {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} conn = http.client.HTTPConnection(host, port=80, timeout=30) conn.request("POST", sms_send_uri, params, headers) response = conn.getresponse() response_str = response.read() conn.close() return response_str if __name__ == '__main__': mobile = "138xxxxxxxx" text = "您的验证码是:121254。请不要把验证码泄露给其他人。" print(send_sms(text, mobile))
2.发邮件
2.1纯文本邮件
代码演示:
#1.发送纯文本邮件 #smtp:简单邮件传输协议 import smtplib #邮件标题 from email.header import Header #邮件文本 from email.mime.text import MIMEText """ user:用户名,注册163邮箱的用户名,手机号@163.com pwd:授权密码 sender:发送方,和用户名相同的 recevier:接收方,包括抄送人 content:邮件正文部分 title;邮件标题 """ def sendMail(user,pwd,sender,recevier,content,title): mail_host = "smtp.163.com" #163的smtp的服务器 #第一部分:准备工作 #1.将邮件信息打包成 一个对象 #参数:正文字符串,格式,编码 message = MIMEText(content,"plain","utf-8") #2.设置邮件的发送方 message["From"] = sender #3.设置邮件的接收方 #模拟:不同的接收方之间使用逗号隔开 message["To"] = ",".join(recevier) #4.设置邮件标题 message["Subject"] = title #第二部分:开始发送邮件 #1.启用SSL发送邮件,端口号一般是465 #参数:服务器地址,端口号 smtpObj = smtplib.SMTP_SSL(mail_host,465) #2.登录邮箱进行验证 #参数:用户名,授权码 #验证指定用户的邮箱是否开启了smtp协议 smtpObj.login(user,pwd) #3.开始发送 #参数:发送者,接受者,邮件信息的对象 smtpObj.sendmail(sender,recevier,message.as_string()) print("发送成功") if __name__ == "__main__": mail_user = "XXXXXXXX@163.com" #邮箱用户名 mail_pwd = "wangdefa" #邮箱授权码 sender = mail_user #发送方 receiver = ["XXXXXXXXXXX@qq.com"] #接收方 title = "Python1811" content = "人生苦短,我用Python" sendMail(mail_user,mail_pwd,sender,receiver,content,title)
2.2有附件的邮件
代码演示:
import smtplib #正文,附件 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication mail_user = "XXXXXXXXXXX@163.com" #邮箱用户名 mail_pwd = "wangdefa #邮箱授权码 sender = mail_user #发送方 receiver = ",".join(["XXXXXXXXXXX@qq.com"]) #接收方 #创建MIMEMultipart对象 msg = MIMEMultipart() msg["Subject"] = "测试测试测试" msg["From"] = sender msg["To"] = receiver #创建MIMEText的对象 text = MIMEText("我是正文部分") msg.attach(text) #创建MIMEApplication的对象 #注意:发送文件,实际上发送的是二进制文件 #参数:需要被发送的文件对象的内容 part = MIMEApplication(open("image.jpg","rb").read()) #设置配置信息[添加头文件] part.add_header("Content-Disposition","attachment",filename="image.jpg") msg.attach(part) #发送邮件 client = smtplib.SMTP() client.connect("smtp.163.com") client.login(mail_user,mail_pwd) client.sendmail(sender,receiver,msg.as_string()) #手动退出服务器 client.quit() print("发送成功")