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 = 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:商家编码:
1697
B、计算规则:
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) #两次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文件的时候,这句话一点用都没有