28、面向对象的进阶、摘要算法
一、面向对象的进阶
1、__getitem__:实例传一个参数,传到它这里,返回值,返回什么值自己可以定义。
class Foo: def __init__(self,name,sex): self.name=name self.sex=sex def __getitem__(self, item): return 'nishishabi' #自定义返回的值 f=Foo('egg','男') print(f['a'])
正常情况下,应该返回参数所对象的正确值 的代码应该是这个样子:
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]
2、__setitem__:为类设置或者赋值,正常情况下应该是对__dict__增加属性值,(也可以设置成其他的乱七八糟的),主要是在对对象进行字典操作的时候会调用这个内置函数。
class Foo: def __init__(self,name,sex): self.name=name self.sex=sex def __setitem__(self, key, value): self.__dict__[key]=value #这个应该是它的正常的作用,设置成其他的也行 f=Foo('egg','男') f['hobby']='apple' #进行字典类操作的时候会调用这个内置函数 print(f.__dict__)
3、__delitem__:执行字典类似的删除的操作的时候,会默认执行的内置函数(如果不想让他有它应该有的作用的时候,也可以设置成别的)
class Foo: def __init__(self,name,sex): self.name=name self.sex=sex def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): #字典类删除操作的时候会执行到它,这是它应该有的作用,设置成其他的也行 del self.__dict__[key] f=Foo('egg','男') f['hobby']='apple' del f['name'] print(f.__dict__)
这种的就是执行了其他的自定义的操作,没有进行他应该有的删除操作。
class Foo: def __init__(self,name,sex): self.name=name self.sex=sex def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('nishishabi') #在这里 f=Foo('egg','男') f['hobby']='apple' print(f.__dict__) del f['name'] print(f.__dict__)
总之:item系列就是在执行类似字典操作的时候 ,提供到的内置函数。
4、__new__:构造方法,创建一个新对象。
单例模式:就是第一次实例化一个类的时候,就会创建一个实例化的对象,再次实例化的时候,就会用之前创建的对象。
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__(A) #第一次实例化,调用object类new一个对象,再次实例化的时候,就会执行以前的(其实是自己设计的) return cls.__instance nezha=A('nezha','38') egg=A('egg',25) print(nezha.name) print(egg.name)
5、__hash__:对对象进行hash调用的时候,会执行类内的__hash__值(如果定义的话),在这里可以重新设置要返回hash的内容。
class A: def __init__(self,name,age): self.name=name self.age=age def __hash__(self): return hash(self.name+self.age) #重新定义返回的hash值 egg=A('egg','nan') apple=A('egg','nan') print(hash(egg)) print(hash(apple))
二、摘要算法:加密
hashlib:提供摘要算法的模块
import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() md5.update(b'123456') print(md5.hexdigest()) #aee949757a2e698417463d47acac93df
注:不管算法多么不同,摘要的功能始终不变;
对于相同的字符串使用同一个算法进行摘要算法,得到的值总是不变的;
使用不同算法对相同的字符串进行摘要,得到的值应该不同;
不管使用什么算法,hashlib的方式总是不变的;
sha :摘要算法的一种,随着等级的算法复杂程度的增加,算法所占用的时间和空间增加
摘要算法的用处:
1、密码的密文储存,之后可以将用户输入的密码摘要算法后进行比对,进行密码验证操作。
2、文件的一致性验证
1)在下载的时候,检查我们下载的文件和远程服务器的文件是否一致
2)两台机器上的文件,你想检查知否一致
加盐:对摘要算法进行安全升级
动态加盐:加盐时候的对象是可变的
import hashlib mm=hashlib.md5(bytes('salt',encoding='utf-8')) mm.update(b'wangyuxing') ret=mm.hexdigest() print(ret)
加盐:
import hashlib md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'')#加盐步骤 md5 = hashlib.md5() md5.update(b'123456') print(md5.hexdigest())