当前位置: 首页 > news >正文

湖南网站托管php网站开发实例教程传智

湖南网站托管,php网站开发实例教程传智,网站栏目标签如何调用,网站构造1. 将对象存储到本地 假如有一个student类,我们定义了好几个对象,想要把这些对象存储下来,该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…

1. 将对象存储到本地

假如有一个student类,我们定义了好几个对象,想要把这些对象存储下来,该怎么办呢

from typing import List
class Student:name: strage: intphones: List[str]
s1 = Student("xiaoming",10,["huawei","xiaomi"])

一个极其简单的想法是把这些对象的值拼接到一起编程字符串存储下来,字段与字段之间使用逗号隔开,list的字段则使用#号隔开,想要使用什么字符自己定,只要约定好即可

# xiaoming,10,huawei#xiaomires = ','.join(s1.name,s1.age,'#'.join(s1.phones))
with open('s1.txt','w') as f:f.write(res)

读取这个字符串后按照我们的约定再反解析出来每个字段

with open('s1.txt','r') as f:res = f.read()name,age,phones = res.split(',')
phones = phones.split('#')s1 = Student(name, age, phones)

这样我们就又可以得到这个对象了。

存储数据的过程就是序列化,解析数据的过程就是反序列化

2. 字符串编码

我们把对象转换成字符串存到了本地文件中,并且可以打开这个文件看到我们的字符串。一切好像都很自然。其实中间存在了一个小gap,我们知道计算机只认识二进制,为啥存储的时候没有变成bytes,反而可以是字符串呢?我们把open函数补全一点儿

with open('s1.txt','w',encoding='utf-8') as f:f.write(res)

可以看到多了一个encoding的参数,就是使用utf-8的方式把这段字符串编码成二进制数据。

计算机只认识二进制,要想传输一个对象,必须将其转换成二进制格式。英文有26个字符,还有一些常用的符号,一个想当然的方法就是让每个字符对应一个数字,这就是ASCII码表,例如

二进制十进制十六进制图形
0010 00003220(空格)(␠)
0010 00013321!
0100 00016541A
0110 00019761a

英文是解决了,中文呢?日文呢?俄文呢?为了把所有的文本统一,搞出了一个unicode码本,每个文本都对应了一个二进制。unicode使用4个字节表示一个字符,这对于英文来说就非常的浪费内存,英国人跟英国人交流基本都是英文,他们浏览网站看到的也基本是英文,同样对于中文来说也一样。所以就提出了utf-8的【编码方式】,utf-8是一种变长编码方式,对于英文来说只需要一个字节就可以了,中文只需要3个字节。

在这里插入图片描述

这里需要注意的是,utf-8是一种unicode的编码方式,打个比方,每个人的手机号都是11位的,但是如果你办了亲情网,只需要3位就可以标识自己的老公,老婆,父母了。11位的手机号相当于unicode,可以表示全国所有的人,而亲情网则可以认为是utf-8编码,得到的那3位就是utf-8编码后的号码。

  • 通过unicode码本可以把字符映射成unicode二进制
  • 通过utf-8编码,可以把unicode二进制转换成更短的二进制

我就想,为啥不直接使用utf-8作为码本呢

所以不要觉得是我们把字符串写到本地了,其实这个字符串通过utf-8编码已经变成二进制存储到本地了。
也不要觉得我们直接打开的是字符串,其实通过notepad打开的是二进制,只不过notepad给我们使用utf-8解码了。将这个二进制重新映射成了unicode,通过unicode找到对应的字符给我们显示了出来。

编码转换

使用统一的unicode编码后,每个人看到的就不会是乱码了,俄文日文都可以在我们的电脑上正确的展示出来了。utf-8需要3个字节表示一个中文,但其实只需要2个字节就可以了,utf-8对中文而言也是有点浪费了,所以提出了gbk编码,只需要2个字节来表示中文。引文只是对中文进行编码,如果想要显示俄文那么就会是乱码。
我们请求网页的时候都会告知这个网页的编码方式,一般都是utf-8的,这样兼容性很好,任意字符都可以显示,也有gbk编码的。

如果一个文本使用utf-8编码,使用gbk格式打开就会乱码,同样,如果使用gbk编码,使用utf-8就会乱码。我们可以先使用对应的编码方式打开,这样得到其实就是unicode码,然后再使用想要的编码方式去保存。

这么说来的话,unicode算是一种事实标准了

4. json序列化

回过头来,我们把对象转换成字符串存储到了本地,也可以根据存储的规则反推出原来的对象,这个过程称之为序列化和反序列化,用逗号分隔的格式一般称为csv。更多会使用json格式来进行序列化。

import json
from typing import Listclass Phone:name: strtime: strclass Student:name: strage: intphones: List[Phone]
p1 = Phone("xiaomi", "2024")
p2 = Phone("huawei", "2008")
s1 = Student("xiaoming",10,[p1, p2])res = {}res['name'] = s1.name
res['age'] = s1.age
res['phones'] = [{'name':"xiaomi",'time':"2024"},{'name':"huawei",'time':"2008"}]res_str = json.dumps(res) # 把对象转换成字符串with open('s1.txt','w') as f:f.write(res_str)with open('s1.txt','r') as f:obj = json.loads(f.read())s2 = Student()
s2.name = obj['name']
s2.age = obj['age']
phones2 = []
for phone in obj['phones']:phones2.appen(Phone(phone.name,phone.time))
s2.phones = phones2
  1. 首先把对象转换成json支持的类型,json支持list,tuple,dict,int,str等基础类型
  2. 通过json的dumps函数我们可以把对象转换成字符串,并写到本地

proto序列化

protobuf本质就是一个【数据结构】,例如下面定义一个student的pb文件

syntax = "proto2";
package tutorial;message Phone{optional string name = 1;optional string time = 2;	
}message Student {optional string name = 1;optional int32 age = 2;repeated Phone phones = 3;
}

message可以认为就是class,repeated其实就是list
同样

  1. 将原始对象转成pb格式的对象
  2. 使用seriral序列化函数转换成字符串,并写入到本地

2. proto生成相应的类

proto文件最终通过proto会生产相应的类文件,如果是c++的话就是student.pb.cc和student.pb.h。

protoc --proto_path=. --cpp_out=. ./student.proto

如果是python则是student_pb2.py。

protoc --proto_path=. --python_out=. ./student.proto

proto_path是搜索proto的路径,而cpp_out是生产.cc和.h的路径,最后则是我们的proto路径。在这里的相对路径是相对于protoc执行的路径而言的,哪里执行命令,哪里就是工作路径。
例如proto文件存储在/a/b/test/addressbook.proto,执行protoc的路径是/c/d,此时proto_path和cpp_out使用的相对路径都是相对于/c/d而言的。

http://www.yayakq.cn/news/75585/

相关文章:

  • wap手机网站开发asp经验数字展厅展馆解决专家
  • php主机网站网站建设属于什么行业分类
  • 天津做网站软件成都招聘网站制作
  • 唯美谷智能网站建设系统微信小程序开发实战源代码
  • 怎样做一元购网站广告网站建设与制作公司
  • 接网站 建设微信公众平台设计
  • 卖服务器建网站搜索量最高的网站
  • 网站建设公司重庆淘宝客网站开发定制
  • 网站建设收费标准信息网站规划有哪些内容
  • 网站文件内容多少与虚拟主机空间大小的关系重庆市建设工程施工安全信息网
  • 网站设计管理方向那个网站可以做域名跳转的
  • 网站样版风格排版龙岗商城网站建设
  • 做图片视频的网站有哪些制作网页软件教程
  • jsp 数据库做网站九创 wordpress
  • 描述网站开发的广告词莱芜上汽大众4s店
  • 推广链接网站企业宣传片广告公司
  • 建设网站的产品规划多开商城
  • 网站绩效营销网站建设公司扬州
  • 网站做后怎么可以在百度搜索到网站建设东北
  • 动效h5网站广州联享品牌网站建设
  • 品牌网站制作网站公司北京上海网站建设公司
  • 二手表网站中山软件开发项目管理
  • 凡科做网站好吗wordpress备份坚果云
  • 搞一个公司网站得多少钱小型购物网站模板
  • 易名网站备案网页设计说明万能模板
  • 企业网站主页设计图网站建设与规划结论
  • 保山市城市建设网站深圳做网站推广的公司哪家好
  • 番禺营销型网站建设网站网站怎么做
  • 网站建设宝安jw网站设计
  • 长沙大型网站设计公司大型科技网站建设