Python筆記day28(物件)|面向物件進階、hashlib
阿新 • • 發佈:2019-02-10
1,內容回顧
# 作業 ——> 反射
# str 和 repr
# 類 object
# repr str
# str --> 類 str repr 父類object str repr
# str --> 類 str 父類str 類repr 父類的repr object類
2,面向物件進階
def getitem(self, item):
def setitem(self, key, value):
def delitem(self, key):
def new(cls, *args, **kwargs):
def eq(self, other):
def hash
def len(self):
def str(self):
dic = {'k':'v'}
# 物件 : 儲存屬性 和呼叫方法
dic['k'] = 'v'
# class Foo:
# def __init__(self,name,age,sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# def __getitem__(self, item):
# if hasattr(self,item):
# return self. __dict__[item]
#
# def __setitem__(self, key, value):
# self.__dict__[key] = value
#
# def __delitem__(self, key):
# del self.__dict__[key]
#
# f = Foo('egon',38,'男')
# print(f['name'])
# f['hobby'] = '男'
# print(f.hobby,f['hobby'])
# del f.hobby # object 原生支援 __delattr__
# del f ['hobby'] # 通過自己實現的
# print(f.__dict__)
# __init__ 初始化方法
# __new__ 構造方法 : 建立一個物件
class A:
def __init__(self):
self.x = 1
print('in init function')
# def __new__(cls, *args, **kwargs):
# print('in new function')
# return object.__new__(A, *args, **kwargs)
# a1 = A()
# a2 = A()
# a3 = A()
# print(a1)
# print(a2)
# print(a3)
# print(a.x)
# 設計模式
# 23種
# 單例模式
# 一個類 始終 只有 一個 例項
# 當你第一次例項化這個類的時候 就建立一個例項化的物件
# 當你之後再來例項化的時候 就用之前建立的物件
# class A:
# __instance = False
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def __new__(cls, *args, **kwargs):
# if cls.__instance:
# return cls.__instance
# cls.__instance = object.__new__(cls)
# return cls.__instance
#
# egon = A('egg',38)
# egon.cloth = '小花襖'
# nezha = A('nazha',25)
# print(nezha)
# print(egon)
# print(nezha.name)
# print(egon.name)
# print(nezha.cloth)
# class A:
# def __init__(self,name):
# self.name = name
#
# def __eq__(self, other):
# if self.__dict__ == other.__dict__:
# return True
# else:
# return False
#
# ob1 = A('egon')
# ob2 = A('egg')
# print(ob1 == ob2)
# hash() #__hash__
# class A:
# def __init__(self,name,sex):
# self.name = name
# self.sex = sex
# def __hash__(self):
# return hash(self.name+self.sex)
#
# a = A('egon','男')
# b = A('egon','nv')
# print(hash(a))
# print(hash(b))
import json
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面的大小 suit牌面的花色
# class FranchDeck:
# ranks = [str(n) for n in range(2,11)] + list('JQKA') # 2-A
# suits = ['紅心','方板','梅花','黑桃']
#
# def __init__(self):
# self._cards = [Card(rank,suit) for rank in FranchDeck.ranks
# for suit in FranchDeck.suits]
#
# def __len__(self):
# return len(self._cards)
#
# def __getitem__(self, item):
# return self._cards[item]
#
# def __setitem__(self, key, value):
# self._cards[key] = value
#
# def __str__(self):
# return json.dumps(self._cards,ensure_ascii=False)
# deck = FranchDeck()
# print(deck[10])
# from random import choice
# print(choice(deck))
# # print(choice(deck))
# from random import shuffle
# shuffle(deck)
# print(deck[10])
# print(deck)
# print(deck[:5])
# 內建函式 內建的模組 內建的基礎型別 < --- >類的內建方法
# == __eq__
# len() __len__
# 100 名字 和 性別 年齡不同
# set
# class A:
# def __init__(self,name,sex,age):
# self.name = name
# self.sex = sex
# self.age = age
#
# # def __eq__(self, other):
# # if self.name == other.name and self.sex == other.sex:
# # return True
# # return False
#
# def __hash__(self):
# return hash(self.name + self.sex)
# a = A('egg','男',38)
# b = A('egg','男',37)
# print(set((a,b))) # unhashable
# set 依賴物件的 hash eq
3,hashlib加密
# 登入認證
# 加密 --> 解密
# 摘要演算法
# 兩個字串 :
# import hashlib # 提供摘要演算法的模組
# md5 = hashlib.md5()
# md5.update(b'123456')
# print(md5.hexdigest())
#aee949757a2e698417463d47acac93df
# 不管演算法多麼不同,摘要的功能始終不變
# 對於相同的字串使用同一個演算法進行摘要,得到的值總是不變的
# 使用不同演算法對相同的字串進行摘要,得到的值應該不同
# 不管使用什麼演算法,hashlib的方式永遠不變
# import hashlib # 提供摘要演算法的模組
# sha = hashlib.md5()
# sha.update(b'alex3714')
# print(sha.hexdigest())
# sha 演算法 隨著 演算法複雜程度的增加 我摘要的時間成本空間成本都會增加
# 摘要演算法
# 密碼的密文儲存
# 檔案的一致性驗證
# 在下載的時候 檢查我們下載的檔案和遠端伺服器上的檔案是否一致
# 兩臺機器上的兩個檔案 你想檢查這兩個檔案是否相等
# 使用者註冊
# 使用者 輸入使用者名稱
# 使用者輸入 密碼
# 明文的密碼進行摘要 拿到一個密文的密碼
# 寫入檔案
# 使用者的登入
# import hashlib
# usr = input('username :')
# pwd = input('password : ')
# with open('userinfo') as f:
# for line in f:
# user,passwd,role = line.split('|')
# md5 = hashlib.md5()
# md5.update(bytes(pwd,encoding='utf-8'))
# md5_pwd = md5.hexdigest()
# if usr == user and md5_pwd == passwd:
# print('登入成功')
# 1234567890
# abcdefghijk
# 6位
# md5
# 撞庫
# 加鹽
import hashlib # 提供摘要演算法的模組
# md5 = hashlib.md5(bytes('鹽',encoding='utf-8'))
# # md5 = hashlib.md5()
# md5.update(b'123456')
# print(md5.hexdigest())
# 動態加鹽
# 使用者名稱 密碼
# 使用使用者名稱的一部分或者 直接使用整個使用者名稱作為鹽
# import hashlib # 提供摘要演算法的模組
# md5 = hashlib.md5(bytes('鹽',encoding='utf-8')+b'')
# # md5 = hashlib.md5()
# md5.update(b'123456')
# print(md5.hexdigest())
#import hashilib
# 做摘要計算的 把位元組型別的內容進行摘要處理
# md5 sha
# md5 正常的md5演算法 加鹽的 動態加鹽
# 檔案的一致性校驗
# 檔案的一致性校驗這裡不需要加鹽
# import hashlib
# md5 = hashlib.md5()
# md5.update(b'alex')
# md5.update(b'3714')
# print(md5.hexdigest())
# 作業: 對一個檔案進行摘要演算法,最後計算出這個檔案的md5值。