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

 

posted @ 2018-01-23 20:56  王二黑  阅读(245)  评论(2编辑  收藏  举报