python学习day28 内置的类方法2 hashilib模块

所有内置方法都由一个内置函数来触发,里面的方法可以自己定义。

 

item系列

__getitem__

__setitem__

__delitem__

操作对象跟操作字典一样

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'])  # 对__getitem__进行操作  返回egon
f['hobby'] = ''
print(f.hobby, f['hobby'])  # 男 男
del f.hobby      # 通过__delattr__方法实现  父类object 原生支持  __delattr__
del f['hobby']   # __delitem__要通过自己实现的
print(f.__dict__)

 

__new__

__init__ 初始化方法
__new__ 构造方法 : 创建一个对象 传入cls参数

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()

输出:

单例模式:一个类 始终 只有 一个 实例
当你第一次实例化这个类的时候 就创建一个实例化的对象
当你之后再来实例化的时候 就用之前创建的对象

 

__eq__

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('egg')
ob2 = A('egg')
print(ob1 == ob2)  # ==触发__eq__

返回True

==触发__eq__,__eq__方法下的内容是定制的

 

__hash__

hash()触发__hash__方法

 

hashlib模块

提供常见的摘要算法,如MD5,SHA1等,对字节类型的内容进行摘要处理

 

 例子:用户登录

根据输入的用户名和密码判断是否登录成功

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('登录成功')

md5.update()将输入的密码用MD5转换

md5.hexdigest()获取转换后的代码

 

加盐

import hashlib   # 提供摘要算法的模块
md5 = hashlib.md5(bytes('salt',encoding='utf-8'))
# md5 = hashlib.md5()
md5.update(b'123456')
print(md5.hexdigest())

动态加盐
使用用户名的一部分或者 直接使用整个用户名作为盐

md5 = hashlib.md5(bytes('',encoding='utf-8')+b'fan')

 

还可以分批做摘要处理

import hashlib
md5 = hashlib.md5()
md5.update(b'alex')
md5.update(b'3714')
print(md5.hexdigest())
# 相当于md5.update(b'alex3714')

 

posted @ 2018-12-24 21:22  xyfun72  阅读(180)  评论(0编辑  收藏  举报