1.面向過程和面向對象的區別
例子:
面向對象編程 class
面向過程編程 執行者
1、4S店 掏錢買車
2、保險公司 上保險
3、稅務局 交購置稅
4、交管局 驗車、選號、交錢、取牌、上牌
面向對象 指揮者
買車辦事處 #直接合為一個整體
1、4S店 掏錢買車
2、保險公司 上保險
3、稅務局 交購置稅
4、交管局 驗車、選號、交錢、取牌、上牌
2.面向對象的一些相關概念
類
一個種類,一個模型。比如汽車模型
對象
指具體的東西,模型造出來的東西叫做對象。
實例
實例和對象是一樣的。
實例化
實例化就是造東西的這個過程。
屬性
就是類里面變量
方法
就是類里面的函數
繼承
封裝
多態
。。。。。
self代表的是本類對象。
因為函數里面的變量都是局部變量,出了函數就不能用了。
用self給對象綁定了之后,就可以self.xx隨便用了
構造函數
def __init__():
pass
構造函數就是類在實例化的時候執行的函數。
類在實例化的時候,會自動執行它
析構函數
def __del__():
pass
實例被銷毀的時候執行的。
屬性方法
看起來像屬性的一個方法。
類變量
類變量,公共的變量,每個實例都可以用
實例變量(成員變量)
實例方法
實例化之后才可以用的。
類方法
1、不用實例化就可以直接調用。
2、它可以通過cls使用類變量
3、它不能調用這個類里面的其他實例方法和實例變量
靜態方法
#你不想實例化的時候,就可以定義成類方法
#靜態方法就是一個普通函數,只不過是寫在類里面而已,它用不了類變量、類方法、實例變量、實例方法
私有
私有方法
私有變量
出了類之后,就不能用了。
if __name__ == '__main__':
判斷這個python是在別的地方導入的,還是直接運行的這個python文件
這句話一般是做調試的時候用的。
1、如果是直接運行這個python文件的時候,這句話一點用都沒有
2、作為模塊,被別的文件導入時,該語句后面就會不執行。
3.類
例子
class Person: #經典類,類名首字母都大寫
#class Person2(object):#新式類 在python3里面經典類和新式類沒有任何區別
def __init__(self,name):#構造函數(不是必須的) 構造函數就是類在實例化的時候執行的函數 類在實例化的時候,會自動執行它(比如連接mysql就可以使用,不必多次連接)
self.name = name #self后就可以在類中直接用 就可以調用屬性或方法
self.nose = 2 #鼻子(屬性)
self.face = 2 #臉
self.head = 10 #腦子
self.wing = 4#翅膀
print('開始造人。。。')
def driver(self):
print('老司機,開車非常穩')
self.eat() #調用類里面的函數
def fly(self):
print('%s 在飛。。'%self.name)
#獲取類里面的變量
def eat(self):
print('%s 吃火鍋,吃小龍蝦,喝啤酒'%self.name)
#類在用到時候,首先必須實例化(類相當於模型不能用,必須實例化)
zll = Person(name='張流量')#造人並賦予名字
zll.driver() #
zlj = Person() #實例化,類名加上括號就是實例化,實例化后保存到zlj
# zlj.eat()
# zlj.fly()
# zlj.fly()
# zlj.eat()
# 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
python基礎教程 %DFSDF url編碼
%DFSDF 學習 url解碼
需求分析:
1、請求數據獲取到
2、提取到商家編碼
3、將商家編碼進程2次md5 得到astr
4、再將請求數據進行一次urldecode,urlstr #urldecode 在訪問頁面會把漢字及特殊字符會變為url編碼發送請求 所以需要url編碼和解碼
如python基礎教程 %DFSDF url編碼 %DFSDF 學習 url解碼
5、astr+url_str MD5
加密規則
from urllib import parse #用到的模塊
url='http://www.baidu.com?query=python基礎教程 sdfsdf &^ '
url_str = parse.quote_plus(url) #url編碼(quote和quote_plus 一樣但后者更好) parse.quote_plus
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('&') #對於獲取的信息先通過&進行分割成list
#【vendorId=1697,poscode=xxx】
for i in sub_list: # 將list轉化為kv的字典
# verid=1697
k,v = i.split('=') #直接將k,v這兩值存放。
#[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): #### 該函數應該放到前面 否則sign調用事出錯,有順序先后的問題,面向對象則沒有先后的限制
md = hashlib.md5() #實例化
md.update(s.encode())# 加密時必須轉為bytes類型
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('&') #在類傳過來已將實例化過了 所以直接self直接調用就可以了
for i in sub_list:
k, v = i.split('=')
data_dict[k] = v
self.verid = data_dict.get('vendorId') #相當於直接加了變量 可以省去使用return返回結果
def get_sign(self):
#self.get_sign() 需要先調用執行一下 或初始化調用
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
print('__nam__',__name__) #__main__
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) #實例化 class才生效
print(abc.sign) #應為sign被定義屬性所以可以直接打印出結果
print('我是sign.....')