• 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())
  • 相关阅读:
    JavaEmail的使用之邮件发送
    《将博客搬至CSDN》
    利用myqr库创建自己的二维码
    魔幻离现实仅一步之遥:细说Python的循环调用、循环引用和循环导入
    Locust做接口性能测试测时候RemoteDisconnected的解决办法(ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))))
    python定时简单爬取网页新闻存入数据库并发送邮件
    利用Python爬取京东商品的一种办法
    基于visual c++之windows核心编程代码分析(42)windows下进程的身份切换
    基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
    基于visual c++之windows核心编程代码分析(46)遍历数字证书
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8336988.html
Copyright © 2020-2023  润新知