python学习笔记(二十)初识面向对象
面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位,将程序和数据封装其中,以提高程序的重用性,灵活性和可扩展性。类是创建对象的模板,一个类可以创建多个对象。对象是类的实例化。
类是抽象的,不占用存储空间;而对象具体的,占用存储空间。
面向对象有三大特性:封装,继承,多态。
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
类:一个种类,一个模型。比如:汽车模型、月饼模型
对象:指具体的东西,模型造出来的东西叫做对象。
实例:实例和对象是一样的。
实例化:实例化就是造东西的这个过程。就是指造汽车或造月饼这个过程。
属性:就是变量
方法:就是类里面的函数
以Person类为例,在Python中,定义类是通过class关键字:
class Person: #经典类
pass
class Person2(object): #新式类
pass
#类名首字母都大写
#在python3里面经典类和新式类没有任何区别
class后面紧接着是类名,即Person,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
定义好了Person类,那么就可以根据Person类造出person实例
class Person: #经典类
def __init__(self,name):#构造函数
self.name = name
self.nose = #鼻子 #类中定义的变量叫属性
self.face = #脸
self.head = #脑子
self.wing = #翅膀
print('开始造人。。。')
def driver(self): #类里面定义变量一定要叫self,不然会报错
print('老司机,开车非常稳')
self.eat() #调用类里面的函数
def fly(self):
print('%s 在飞。。'%self.name)
#获取类里面的变量
def eat(self):
print('%s 吃火锅,吃小龙虾,喝啤酒'%self.name) #类在用到时候,首先必须实例化
zlj = Person('小喵喵') #实例化,类名加上括号就是实例化
zlj.eat()
zlj.fly()
print(zlj.wing)
print(zlj.nose)
现在我们来做一个练习,根据某公司的签名规则编写签名代码,首先我们定义函数来实现
签名规则如下:
A、输入数据:
、请求数据:
vendorId=&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.&mac=;D4--D7-CA--;7C--A2-9A--;7C--A2-9A--;7C--A2-9A--;-----0000E0
:商家编码: B、计算规则:
、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF
、将请求数据
vendorId=&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.&mac=;D4--D7-CA--;7C--A2-9A--;7C--A2-9A--;7C--A2-9A--;-----0000E0
进行urlDecode处理(编码格式为utf-)得到一个字符串urlDecodeStr:
vendorId=&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.&mac=;D4--D7-CA--;7C--A2-9A--;7C--A2-9A--;7C--A2-9A--;-----0000E0
、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5
vendorId=&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.&mac=;D4--D7-CA--;7C--A2-9A--;7C--A2-9A--;7C--A2-9A--;-----0000E009B764965CE4E92BED8BD3140E22D5CF
然后将 beforeMD5字符串进行加密得到最终的签名:
6F811B63B11D92BA4A359E6DC98EEE31
分析思路:
1.获取到请求数据
2.提取到商家编码
3.将商家编码进行2次MD5加密,得到astr
4.再将请求数据进行一次urldecode,得到urlstr
5.拼接astr+url_str,然后再进行一次MD5加密
插入一个小知识点,url编码和url解码
from urllib import parse
url='http://www.baidu.com?query=python基础教程 sdfsdf &^ '
url_str = parse.quote_plus(url) #url编码
print(parse.quote_plus(baidu_url))
baidu_url = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&oq=python&rsv_pq=b6c92ffc00023232&rsv_t=be4d%2FdgIVLHbmdj5jU9bfpJTXGIAcO4y2u%2BfKsxWWJW2wIKbEuXL6tNXiug&rqlang=cn&rsv_enter=1&inputT=878&rsv_sug3=9&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&prefixsug=python&rsp=1&rsv_sug4=2134&rsv_sug=1'
print(parse.unquote_plus(baidu_url)) #url解码
签名规则使用函数实现,代码如下:
from urllib import parse
import hashlib
def get_vendorid(req_data):
data_dict = {}
sub_list = req_data.split('&') #[vendorId=,poscode=xxx]
for i in sub_list: # verid=1697,将list转换成字典
k,v = i.split('=') #[verid,]
data_dict[k]=v # data_dict.setdefault(k,v)
return data_dict.get('vendorId') def sign(req_data):
verid = get_vendorid(req_data) #调用获取veriodid函数
first = my_md5(verid)
astr = my_md5(first) #两次md5
url_str = parse.quote_plus(req_data) #url编码
res = my_md5(astr+url_str)
return res def my_md5(s):
md = hashlib.md5()
md.update(s.encode())
return md.hexdigest() print(sign(s))
通过类来实现签名规则,代码如下:
class Sign(object):
def __init__(self,req_data):
self.req_data = req_data #这写了self的话,在其他的函数里面也可以用self.xx
self.get_verid()
self.get_sign()
def md5(self,s):
md = hashlib.md5()
md.update(s.encode())
return md.hexdigest() def get_verid(self):
data_dict = {}
sub_list = self.req_data.split('&')
for i in sub_list:
k, v = i.split('=')
data_dict[k] = v
self.verid = data_dict.get('vendorId')
def get_sign(self):
frist = self.md5(self.verid)
astr = self.md5(frist)
url_str = parse.quote_plus(self.req_data)
self.sign = self.md5(astr+url_str)
return self.sign
if __name__ == '__main__':
s='vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0'
abc = Sign(s)
print(abc.sign)
print('我是sign.....')
#if __name__ == '__main__':
#判断这个python是在别的地方导入的,还是直接运行的这个python文件
#这句话一般是做调试的时候用的。如果是直接运行这个python文件的时候,这句话一点用都没有
python学习笔记(二十)初识面向对象的更多相关文章
- python学习笔记-(十)面向对象基础
面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...
- python 学习笔记二十 django项目bbs论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...
- Python学习笔记(十四)
Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
- Python学习笔记(十)
Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...
- python学习笔记(二)、字符串操作
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...
随机推荐
- CI框架中 类名不能以方法名相同
昨天晚上一个坑爹的问题折腾了我一晚上,首先我来说下我的代码,我建立了一个index的控制器然后呢 在控制器里有一个index的方法.页面模板都有. if ( ! defined('BASEPATH' ...
- 【转】【Linux】grep命令详解
简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...
- java深度搜索与广度优先搜索
图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class GraphNode { public List<GraphEdge> ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的图像处理算法优化库vlib
The Texas Instruments VLIB is an optimizedImage/Video Processing Functions Library for C programmers ...
- ThinkPHP无限级分类
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...
- 启动nmon报错while load libncurses.so.5 can not open shared(bit64)
yum install ncurses-devel.i686 也有可能是软件包本身有问题,换一个try
- hdu 1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路:dp[u][i]表示以u为根的树选了i个子节点. #include<iostream ...
- 表空间_暂时表空间引起的错误:ora-01652 小例
原创作品,出自 "深蓝的blog" 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46888243 报暂 ...
- kafka对比RocketMQ(转)
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...
- JSP页面的生命周期
JSP页面的生命周期:我们假设要访问的jsp页面是index.jsp.首先,用户发出请求index.jsp:服务器会判断是否是第一次请求:如果是的话,JSP引擎会把该JSP文件转换成为一个Servle ...