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 = nameself.nose = 2 #鼻子  #类中定义的变量叫属性self.face = 2 #脸self.head = 10 #脑子self.wing = 4#翅膀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、输入数据:
1、请求数据:
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
2:商家编码:
1697B、计算规则:
1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF
2、将请求数据
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
进行urlDecode处理(编码格式为utf-8)得到一个字符串urlDecodeStr:
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
3、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5
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-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=1697,poscode=xxx]for i in sub_list:        # verid=1697,将list转换成字典k,v = i.split('=')    #[verid,1697]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)    #两次md5url_str = parse.quote_plus(req_data)  #url编码res = my_md5(astr+url_str)return resdef 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.xxself.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] = vself.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文件的时候,这句话一点用都没有


转载于:https://www.cnblogs.com/mululu/p/9068047.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂 | 进程怎么绑定 CPU

昨天在群里有朋友问:把进程绑定到某个 CPU 上运行是怎么实现的。首先,我们先来了解下将进程与 CPU 进行绑定的好处。进程绑定 CPU 的好处:在多核 CPU 结构中,每个核心有各自的L1、L2缓存,而L3缓存是共用的。如果一个进…

每日一题(25)—— 自加++

C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a 5, b 7, c; c ab; 不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根…

Spark天堂之门解密

本课主题 什么是 Spark 的天堂之门Spark 天堂之门到底在那里Spark 天堂之门源码鉴赏引言 Spark 天堂之门就是SparkContext,这篇文章会从 SparkContext 创建3大核心对象 TaskSchedulerImpl、DAGScheduler 和 SchedulerBackend 开始到注册给 Master 这个过程中的源码鉴…

C语言,使用union了解内存

今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。代码如下:#include "stdio.h" int main() {typedef union{short i;char j[2];}DATA;DATA a;a.j[0] 10;a.j[1] 1;printf("%x\n",a.i);return 0; }他的几个测试代码以及输出…

我做技术的这十年,我不做技术的这一年~

我和明哥认识是因为之前他在群里跟我们分享一件事情,当时因为明哥相信网上认识的一个朋友,说是要一起开发一个项目,结果他被骗了几万块钱。然后聊着聊着,我觉得明哥太实诚了,后面继续接触,知道他做的一些决…

每日一题(26)—— 无限循环的几种形式

嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 1、while(1) { } —— 个人推荐使用 2、for(;;) { } —— 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。 3、goto Loop: ... goto Loop; —— 应试者如给…

Oracle Golden Gate概要

Oracle GoldenGate简介 Oracle Golden Gate用于源数据库与目标数据库的数据复制备份;可以在异构的环境(各种操作系统和数据库)之间实现数据亚秒级的实时复制备份;以及可以在实时数据仓库、数据同步、集中/分发、容灾、数 据库升级和迁移等多个场景下应用…

android 音频加载hal so调试

1. 整个加载流程图 2. 加载hal so的代码位置 2.1 在audiopolicymanager中的加载位置 diff --git a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index 632290a9…

【修炼5】《基础篇》别把项目成功当目标

副标题——做对的事情&#xff0c;远比你把事情做对&#xff0c;来的重要&#xff01;&#xff08;作者&#xff1a; 孙继滨&#xff09;<?xml:namespace prefix o />【项目经理之修炼】 全文索引给大家提一个问题&#xff1a;***************************************…

每日一题(27)—— define定义一个宏表明1年中有多少秒

用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; 分析&#xff1a; 1、#define 语法的基本知识&#xff08;例如&#xff1a;不能以分号结束&#xff0c;括号的使用&#xff0c;等等&#xff09; 2、懂得预处理器将…

String,StringBuffer与StringBuilder的区别??

String,StringBuffer与StringBuilder的区别?? String 字符串常量StringBuffer 字符串变量&#xff08;线程安全&#xff09;StringBuilder 字符串变量&#xff08;非线程安全&#xff09; 简要的说&#xff0c; String 类型和 StringBuffer 类型的主要性能区别其实在于 Strin…

鸿蒙的路还很长

这是昨晚看到我的老领导发的和鸿蒙有关的文章&#xff0c;我在下面评论了&#xff0c;作为科技自媒体屌丝本屌&#xff0c;我昨晚也是看了鸿蒙2.0的发布会&#xff0c;也有一些观点。鸿蒙OS是什么&#xff1f;鸿蒙os是一个操作系统&#xff0c;而且是面向智能终端的&#xff0c…

有关Accordion组件的研究——Silverlight学习笔记[27]

Accordion组件在开发中常用于信息的分类显示。本文将为大家介绍该组件的特性以及通过一个实例讲述该组件的基本运用。组件所在命名控件&#xff1a;System.Windows.Controls组件常用方法&#xff1a;SelectAll&#xff1a;选择所有位于Accordion组件中的Accordion项。&#xff…

螺旋格式输出数据

螺旋格式输出数据 问题&#xff1a;(问答题) 编程输出以下格式的数据。 When i0 1 When i1 7 8 96 1 25 4 3 When i2 21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13 1、Python&#xff1a; def format_…

每日一题(28)—— 引用与指针的区别

引用与指针有什么区别&#xff1f; &#xff08;1&#xff09;引用必须被初始化&#xff0c;指针不必&#xff1b; &#xff08;2&#xff09;引用初始化以后不能被改变&#xff0c;指针可以&#xff1b; &#xff08;3&#xff09;不存在指向空值的引用&#xff0c;但是存在…

聊聊 top 命令中的 CPU 使用率

之前写过cpu占用率的文章CPU占用率是什么&#xff1f;平常我们使用 top 命令来查看系统的性能情况&#xff0c;在 top 命令中可以看到很多不同类型的 CPU 使用率&#xff0c;如下图红框中标出部分&#xff1a;下面&#xff0c;我们来介绍一下这些 CPU 使用率的意义&#xff1a;…

Linux 脚本、 正则表达式 等

shell的脚步总是以这样的一行开头&#xff1a;#!/bin/bash这行叫做shebang顺序执行两个命令&#xff0c;可以$cmd1;cmd2要验证脚本语法的准确性&#xff0c;可以用bask-nscriptfilename来验证如果要debug则为bash-xscr.sh删除老的文件&#xff1a;find /home/wwwroot -type f-m…

哈尔特征Haar

哈尔特征&#xff08;Haar-like features&#xff09; 是用于物体识别的一种数字图像特征。它们因为与哈尔小波转换 极为相似而得名&#xff0c;是第一种即时的人脸检测運算。 历史上&#xff0c;直接使用图像的强度(就是图像每一个像素点的RGB值)使得特征的计算强度很大。帕帕…

乐鑫科技2022笔试面试题

来源于读者投稿&#xff0c;作者来源于牛客网的 galun 。投递方式&#xff1a;内推。岗位&#xff1a;嵌入式软件实习生。个人情况&#xff1a;本科双非电子信息工程&#xff0c;硕士华五软件工程研一在读&#xff1b;本科做过一些很水的项目 &#xff0c;也拿项目搞了一些奖&a…