面向对象
1.类 class
用来描述具有相同的属性和芳芳的对象的集合,它定义了该集合中每个对象所共有的属性和方法。一个种类,一个模型。比如汽车模型。比如:
#定义一个Person类
#1.类名的首字母要大写
#2.在python3里经典类和新式类没有任何区别
方式一:
class Person: #经典类
pass
方式二:
class Person(object): #新式类
pass
2.对象
指具体的东西,根据模型造出来的东西叫对象。
3.实例
实例和对象是同一个叫法
4.实例化
实例化就是造东西的过程,类的具体对象。
5.属性
属性其实就是变量
6.方法
方法就是类里面的函数
①.构造函数:
def __init__():
pass
1.构造函数就是类在实例化的时候执行的函数
2.类在实例化的时候,首先会自动执行构造函数
3.构造函数不是必须的
②.析构函数:
def __del__():
pass
1.函数被销毁的时候被调用,当对象不再被使用时,__del__方法运行:
实例:
7.继承
类的继承:代码重用
8.封装
9.多态
以下举例介绍:
class Person: #经典类
#构造函数:就是类在实例化的时候执行的函数,比如在执行实例化zll=Person()时,首先会执行构造函数
def __init__(self):#构造函数,不是必须写的
self.nose = 2 #鼻子 #属性
self.head = 10 #脑子 #属性
self.wing = 4#翅膀 #属性
print('开始造人。。。')
def driver(self): #方法
print('老司机,开车非常稳')
self.eat() #调用类里面的函数
def fly(self): #方法
print('在飞。。') #获取类里面的变量
def eat(self): #方法
print('吃火锅,吃小龙虾,喝啤酒')
#类在用的时候,首先必须实例化,然后可以调用类里的方法或属性
zll = Person() #实例化,类名加上括号。(造了一个人:zll,即实例化一个对象,赋给变量zll)
zll.driver() #调用类里的方法
print(zll.nose) #调用类里的属性
传参:
若构造函数里有参数时,实例化时也应该传入对应参数,比如:
class Person(): #创建类
def __init__(self,name): #构造函数,定义参数name
self.name=name
self.nose = 2
def fly(self):
print('%s 在飞...'%self.name) #在一个类里,通过self.xx直接调用变量,直接取传入的name
self.eat() #通过self直接调用类里的函数
def eat(self):
print('%s 吃火锅,喝啤酒' %self.name)
#实例化一个对象:
aaa=Person('fancy') #在实例化aaa时,应该传入参数,不然会报错
aaa.driver() #实例化aaa,调用aaa里的方法driver()
self:
1.self代码类的实例,self在定义类的方法时是必须有的。
2.self代表本类对象。
3.因为函数里面的变量都是局部变量,除了函数就不能用了,用self给对象绑定了之后,就可以self.xx调用函数或方法
下面通举例:面向过程和面向对象
分解需求:
1、请求数据获取到
2、提取到商家编码
3、将商家编码进程2次md5 得到astr
4、再将请求数据进行一次urldecode,urlstr
5、astr+url_str MD5
面向过程方式实现:
from urllib import parse import hashlib 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' def get_vendorid(req_data): data_dict = {} sub_list = req_data.split('&') #【vendorId=1697,poscode=xxx】 for i in sub_list: # verid=1697 k,v = i.split('=') #[verid,1697] # data_dict.setdefault(k,v) data_dict[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))
面向对象实现:
import urllib import parse import hashlib 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)