day19(内置函数进阶,hashlib)

1.复习

三个模块         *****
进阶的剩余部分   ***

作业 ——> 反射
str 和 repr
类 object
repr str
str --> 类 str repr 父类object str repr
str --> 类 str 父类str 类repr 父类的repr object类

2.内置函数进阶

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值。

猜你喜欢

转载自blog.csdn.net/qq_36227329/article/details/81272682