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