1. 程式人生 > >,邁向大神 day 21 面向物件 和hashilib初識.

,邁向大神 day 21 面向物件 和hashilib初識.

#面向物件的進階

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 前景色 ]背景色