博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python学习之老男孩python全栈第九期_day028知识点总结——面向对象进阶、hashlib...
阅读量:7112 次
发布时间:2019-06-28

本文共 4921 字,大约阅读时间需要 16 分钟。

一. 面向对象进阶与实例

dic = {
'k': 'v' }对象:存储 属性 和 调用方法dic['k'] = 'v'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', 22, '男')print(f['a'])print(f['name'])f['hobby'] = '男'print(f.hobby,f['hobby'])print(f.__dict__)del f.hobby # object 原生支持 __delattr__print(f.__dict__)print(f.__dict__)del f['hobby'] # 通过自己实现print(f.__dict__)
__init__ :初始化方法构造方法:创建一个对象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)a = A()print(a.x)
设计模式:23 种  1. 单例模式:一个类始终只有一个实例当第一次实例化这个类的时候,就创建一个实例化的对象当之后再来实例化的时候,就用之前创建的那个对象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        else:            cls.__instance = object.__new__(A)            return cls.__instanceegon = A('egon',22)egon.cloth = '小花袄'nezha = A('nezha',32)print(nezha)print(egon)                     # 内存地址一样print(nezha.name)               # nezhaprint(egon.name)                # nezhaprint(nezha.cloth)              # 小花袄
__eq__class A:    def __init__(self, name):        self.name = name    def __eq__(self,other):        if self.name == other.name:            return True        else:            return Falseobj1 = A('egon')obj2 = A('egn')print(obj1 == obj2)         # 不实现__eq__时,默认比较内存地址     Flase
# __hash__   hash()class A:    def __init__(self,name,sex):        self.name = name        self.sex = sex    def __hash__(self):        return hash(self.name+self.sex)a = A('egon','男')b = A('egon','男')print(hash(a))print(hash(b))a = A('egon','男')b = A('egn','男')print(hash(a))print(hash(b))

实例

1 import json 2 from collections import namedtuple 3 Card = namedtuple('Card',['rank','suit'])       # rank 牌的大小,suit 牌的花色 4 # c1 = Card(2,'红桃') 5 # print(c1) 6 # print(c1.suit) 7 class FranchDeck: 8     ranks = [str(n) for n in range(2,11)] + list('JQKA')        # 2 - A 9     suits = ['红桃', '方块', '梅花', '黑桃']10 11     def __init__(self):12         self.__cards = [Card(rank, suit) for rank in FranchDeck.ranks13                                         for suit in FranchDeck.suits]14     def __len__(self):15         return len(self.__cards)16     def __getitem__(self, item):17         return self.__cards[item]18     def __setitem__(self, key, value):19         self.__cards[key] = value20     def __str__(self):21         return json.dumps(self.__cards, ensure_ascii=False)22 deck = FranchDeck()23 print(deck[10])24 from random import choice25 print(choice(deck))26 from random import shuffle27 shuffle(deck)28 print(deck[10])29 print(deck)30 print(deck[:4])
扑克牌
# 内置函数 内置的模块 内置的基础类型 ,都和类的内置方法有联系
# 一道面试题:有一个类,这个类有100个对象,其中有很多对象,名字和性别相同,但年龄不同,就认为是同一个对象,实现去重class A:    def __init__(self, name, sex, age):        self.name = name        self.sex = sex        self.age = age    def __eq__(self, other):        return self.name == other.name and self.sex == other.sex    def __hash__(self):        return hash(self.name + self.sex)a = A('egon', '男',22)b = A('egon', '男',23)print(set((a,b)))                       # set 依赖对象的 hash eq

 

二. hashlib

非常非常重要 非常非常重要 非常非常重要登录认证摘要算法import hashlib              # 提供摘要算法的模块md5 = hashlib.md5()md5.update(b'alex3714')print(md5.hexdigest())          # 结果不会变不管算法多么不同,摘要的功能始终不变对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的使用不同算法对相同的字符串进行摘要,得到的值应该不同不管使用什么算法,hashlib的方式永远不变import hashlibpaw = hashlib.sha1()paw.update(b'alex3714')print(paw.hexdigest())sha 算法, 随着算法复杂程度的增加, 摘要的时间成本 空间成本都会增加摘要算法密码的密文存储文件的一致性验证    在下载时,会检查下载的文件和远程服务器上的文件是否一致    两台机器上的两个文件,想检查这两个文件是否相等用户注册用户输入用户名用户输入密码确认密码明文的密码进行摘要,拿到一个密文的密码写到文件里用户登录import hashlibuser = input('请输入用户名:')password = input('请输入密码:')with open('userInfo',encoding='utf-8') as f:    for line in f:        user,passwd,job = line.split('|')        md5 = hashlib.md5()        md5.update(bytes(password,encoding='utf-8'))        md5_password = md5.hexdigest()        if user == user and md5_password == passwd:            print('登录成功')撞库加盐import hashlibmd5 = hashlib.md5(bytes('salt',encoding='utf-8'))md5 = hashlib.md5()md5.update(b'123456')print(md5.hexdigest())动态加盐用户名 密码使用用户名的一部分作为盐import hashlibmd5 = hashlib.md5(bytes('salt',encoding='utf-8') + b'135')md5.update(b'123456')print(md5.hexdigest())摘要算法:做摘要计算的,把字节类型的内容进行摘要处理md5 sha1md5加密方式  正常的md5算法、加盐的、动态加盐文件的一致性校验文件的一致性校验这里不需要加盐import hashlibmd5 = hashlib.md5()md5.update(b'alex')md5.update(b'3714')             # md5.update(b'alex3714')    一样的print(md5.hexdigest())

 

转载于:https://www.cnblogs.com/BlameKidd/p/9416685.html

你可能感兴趣的文章
代码阅读分析工具Understand 2.0试用
查看>>
[LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
查看>>
menuStrip鼠标经过自动显示菜单
查看>>
LoadRunner 11简单使用
查看>>
Android 各个版本号WebView
查看>>
VS2013常用快捷键
查看>>
关系数据库中的几种设计范式
查看>>
[Everyday Mathematics]20150304
查看>>
jquery动态改变div宽度和高度
查看>>
adroid 目录
查看>>
mybatis map foreach遍历
查看>>
Windows7下的免费虚拟机(微软官方虚拟机)
查看>>
Linux下暴力破解工具Hydra详解
查看>>
Offer是否具有法律效力?
查看>>
Android SQLite系列
查看>>
怎么去掉li标签前面的点??
查看>>
Conjugate prior relationships
查看>>
深入Javascript中apply、call、bind
查看>>
.NET_Framework_version_history
查看>>
Android程序员必备精品资源
查看>>