1. 程式人生 > >Python筆記day28(物件)|面向物件進階、hashlib

Python筆記day28(物件)|面向物件進階、hashlib

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

(self):
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值。