python学习之老男孩python全栈第九期_day028知识点总结——面向对象进阶、hashlib
一. 面向对象进阶与实例
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.__instance
egon = A('egon',22)
egon.cloth = '小花袄'
nezha = A('nezha',32)
print(nezha)
print(egon) # 内存地址一样
print(nezha.name) # nezha
print(egon.name) # nezha
print(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 False
obj1 = 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))
实例
import json
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌的大小,suit 牌的花色
# c1 = Card(2,'红桃')
# print(c1)
# print(c1.suit)
class FranchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA') # 2 - A
suits = ['红桃', '方块', '梅花', '黑桃'] def __init__(self):
self.__cards = [Card(rank, suit) for rank in FranchDeck.ranks
for suit in FranchDeck.suits]
def __len__(self):
return len(self.__cards)
def __getitem__(self, item):
return self.__cards[item]
def __setitem__(self, key, value):
self.__cards[key] = value
def __str__(self):
return json.dumps(self.__cards, ensure_ascii=False)
deck = FranchDeck()
print(deck[10])
from random import choice
print(choice(deck))
from random import shuffle
shuffle(deck)
print(deck[10])
print(deck)
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 hashlib
paw = hashlib.sha1()
paw.update(b'alex3714')
print(paw.hexdigest()) sha 算法, 随着算法复杂程度的增加, 摘要的时间成本 空间成本都会增加 摘要算法
密码的密文存储
文件的一致性验证
在下载时,会检查下载的文件和远程服务器上的文件是否一致
两台机器上的两个文件,想检查这两个文件是否相等 用户注册
用户输入用户名
用户输入密码
确认密码
明文的密码进行摘要,拿到一个密文的密码写到文件里 用户登录 import hashlib
user = 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 hashlib
md5 = hashlib.md5(bytes('salt',encoding='utf-8'))
md5 = hashlib.md5()
md5.update(b'')
print(md5.hexdigest()) 动态加盐
用户名 密码
使用用户名的一部分作为盐 import hashlib
md5 = hashlib.md5(bytes('salt',encoding='utf-8') + b'')
md5.update(b'')
print(md5.hexdigest()) 摘要算法:做摘要计算的,把字节类型的内容进行摘要处理
md5 sha1
md5加密方式 正常的md5算法、加盐的、动态加盐 文件的一致性校验
文件的一致性校验这里不需要加盐 import hashlib
md5 = hashlib.md5()
md5.update(b'alex')
md5.update(b'') # md5.update(b'alex3714') 一样的
print(md5.hexdigest())
python学习之老男孩python全栈第九期_day028知识点总结——面向对象进阶、hashlib的更多相关文章
- python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法
一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...
- python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合
一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...
- python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块
一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...
- python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法
一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...
- python学习之老男孩python全栈第九期_day010知识点总结
def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...
- python学习之老男孩python全栈第九期_day007知识点总结
基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...
- python学习之老男孩python全栈第九期_day001知识点总结
1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...
- python学习之老男孩python全栈第九期_day014知识点总结
# 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...
- python学习之老男孩python全栈第九期_day016知识点总结
'''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...
随机推荐
- random 模块常用方法学习
>>> import random#随机小数>>> random.random() # 大于0且小于1之间的小数0.7664338663654585>> ...
- 阿里巴巴前端面试分享-社招(p6)
借鉴了朋友的阿里面试经:(社招前端2年经验) 电话面 简单自我介绍, 做过哪些项目, 使用哪些技术栈 ? 如何看待前端框架选型 ? vue的如何实现双向绑定的 ? react 虚拟DOM 是什么? 如 ...
- 49.RocketMQ 双主搭建(本文非EamonSec原创)
声明:本文非EamonSec原创,copy自网上下载的某个个文件 1.RocketMQ介绍 1.1. 简介 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 ...
- 服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站
我们都知道网络上的爬虫非常多,有对网站收录有益的,比如百度蜘蛛(Baiduspider),也有不但不遵守robots 规则对服务器造成压力,还不能为网站带来流量的无用爬虫,比如宜搜蜘蛛(YisouSp ...
- Hadoop 3.1.2 下载安装和分布式搭建的准备
官方有详细文档:https://hadoop.apache.org/docs/r3.1.2/hadoop-project-dist/hadoop-common/SingleCluster.html 我 ...
- docker 运行容器时为容器起别名
docker run --name=mydemo -p -d 2222:80 imagename --name: 指定容器名称 -p:指定容器端口号 -d:指定容器后台运行
- Codeforces Round #555 (Div. 3) A B C1(很水的题目)
A. Reachable Numbers 题意:设f(x)为 x+1 这个数去掉后缀0的数,现在给出n,问经过无数次这种变换后,最多能得到多少个不同的数. 代码 #include<cstdio& ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- start and end call use itelephony and how to pick up a call
Bluetooth Headset service: 但想想而已. 没有蓝牙耳机如何调用它来接听电话.想想有点搞笑. 网上扒的通过添加一个ITelephony.aidl来反射,注意aidl的写法,如果 ...
- mono上部署web程序初体验
早就想体验一下mono,但一直琐事缠身.难得有时间,便在网上一通狂搜mono相关的资料. 如果想使用Apache服务器,只能使用mod_mono的方式,这里有详细的介绍.这种方式有点繁琐,需要安装一大 ...