astr在python_python学习笔记(二十)初识面向对象

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

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

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

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

类:一个种类,一个模型。比如:汽车模型、月饼模型

对象:指具体的东西,模型造出来的东西叫做对象。

实例:实例和对象是一样的。

实例化:实例化就是造东西的这个过程。就是指造汽车或造月饼这个过程。

属性:就是变量

方法:就是类里面的函数

以Person类为例,在Python中,定义类是通过class关键字:

classPerson: #经典类

passclass Person2(object): #新式类

pass

#类名首字母都大写

#在python3里面经典类和新式类没有任何区别

class后面紧接着是类名,即Person,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

定义好了Person类,那么就可以根据Person类造出person实例

classPerson: #经典类

def __init__(self,name):#构造函数

self.name=name

self.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-0000E02:商家编码:1697B、计算规则:1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF2、将请求数据

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-0000E03、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解码

fromurllib 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解码

签名规则使用函数实现,代码如下:

fromurllib 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) #两次md5

url_str=parse.quote_plus(req_data) #url编码

res= my_md5(astr+url_str)returnres

def my_md5(s):

md=hashlib.md5()

md.update(s.encode())returnmd.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())returnmd.hexdigest()

def get_verid(self):

data_dict={}

sub_list= self.req_data.split('&')for i insub_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文件的时候,这句话一点用都没有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值