,邁向大神 day 21 面向物件 和hashilib初識.
阿新 • • 發佈:2018-12-19
#面向物件的進階
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'] = '男'
#字典的雙下方法
del f.hobby # object 原生支援 __delattr__
del f['hobby'] # 通過自己實現的
print(f.__dict__)
#item
init 初始化方法 new 構造方法 建立物件 建立self 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)
__eq__
class A:
def __init__(self,name):
self.name = name
def __eq__(self, other):
if self.__dict__ == other.__dict__:
return True
else:
return False
#if self.name=other.name: return True
ob1 = A('egon')
ob2 = A('egg') #預設的是比較記憶體地址
print(ob1 == ob2)
‘hash’
洗牌
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])
姓名 和性別 年齡不相同 合併
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
hashilib初識.
加密-》解密
摘要演算法
import hashlib # 提供摘要演算法的模組
md5 = hashlib.md5()
#hashlib
md5.update(b'123456')
print(md5.hexdigest())
他也不知道 你的密碼 所以重置
不管演算法多麼不同,摘要的功能始終不變
對於相同的字串使用同一個演算法進行摘要,得到的值總是不變的
使用不同演算法對相同的字串進行摘要,得到的值應該不同
不管使用什麼演算法,hashlib的方式永遠不變
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('登入成功')
撞庫
# 使用者的登入
# 加鹽
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())
可以分別摘要
print("\033[0;36m xiaozi")
print(" xiaozi lihang \033[0m")
print("6666")
#[0 前景色 ]背景色