python面向对象1

面向对象

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.....')




原文地址:https://www.cnblogs.com/fancyl/p/9068353.html