面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位,将程序和数据封装其中,以提高程序的重用性,灵活性和可扩展性。类是创建对象的模板,一个类可以创建多个对象。对象是类的实例化。

类是抽象的,不占用存储空间;而对象具体的,占用存储空间

面向对象有三大特性:封装,继承,多态

面向对象最重要的概念就是类(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学习笔记(二十)初识面向对象的更多相关文章

  1. python学习笔记-(十)面向对象基础

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  2. python 学习笔记二十 django项目bbs论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  3. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  4. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  5. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  6. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  7. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  8. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  9. Python学习笔记(十)

    Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...

  10. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

随机推荐

  1. 修改ElasticSearch默认的from size

    2016年04月07日 17:04:17 阅读数:8065 如果需要搜索分页,可以通过from size组合来进行.from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认 ...

  2. 性能加速 - 开启opcache

    说明 PHP 5.5+版本以上的,可以使用PHP自带的opcache开启性能加速(默认是关闭的).对于PHP 5.5以下版本的,需要使用APC加速,这里不说明,可以自行上网搜索PHP APC加速的方法 ...

  3. php 转码

    //$names = iconv("UTF-8", "gb2312", $name); //等同于javascript encodeURI("电影&q ...

  4. 关于Unity中的新手编码技巧

    写代码遇到报错,问题怎么办?怎么查看unity代码的接口?函数参数不记得了怎么办? 解决方法: 1.选择不懂的函数或类,按F12,跳转到代码的定义,自己去看就可知道了. 2.有的时候,选择一个函数,按 ...

  5. 【BZOJ】1016: [JSOI2008]最小生成树计数(kruskal+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1016 想也想不到QAQ 首先想不到的是:题目有说,具有相同权值的边不会超过10条. 其次:老是去想组 ...

  6. LR的响应时间与使用IE所感受时间不一致的讨论(摘抄补充)

    http://www.51testing.com/html/33/564333-865629.html 在做性能测试时,有时碰到这样一种情况,使用性能工具LR测试出来的响应时间比实际使用IE感受到的时 ...

  7. MyBitis(iBitis)系列随笔之三:简单实现CRUD

    Mybitis(iBitis)实现对对象增删改查操作要借助<select/>查询,<insert/>增加,<update/>更新,<delete/>删除 ...

  8. nib文件的默认搜索规则

    if you do not specify a nib name, and do not override the loadView method in your custom subclass, t ...

  9. vs 代码自动对其(注释,等号...)

    插件:Code alignment  下载地址

  10. Tomcat上进行项目部署与WAR包含义

    一.WAR包 1.与JAR包类似,是将java类(编译好的.class)和Web资源,压缩后生成压缩包. 2. 与JAR相比,多了WEB-INF文件夹,其它多出来的内容基本都是Web资源 WEB-IN ...