面向对象
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.继承
类的继承:代码重用
class Zll(object): #父类
def __init__(self):
self.money = 1000000000 #定义变量
self.house = '3环里20套'
def sing(self): #方法
print('唱歌')
def dance(self):
print('跳广场舞')
def lm(self):
print('找朋友')
class Zxl(Zll): #子类,Zxl()继承Zll()
def dance(self):
print('跳霹雳舞') #若子类里有自己的方法,在调用时会先调用子类里的方法
ll = Zxl() #实例化
ll.sing() #调用方法
ll.dance()
print(ll.money)
结果:
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))
面向对象实现:
from 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
#1.if __name__=__main__ 这句话一般是调试的时候用的;
#2.如果加上这句话运行本python文件,这句话不起作用;
#3.若加上这句话,如果在其他文件导入该文件,那么该文件是不起作用的。
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.....')