设计模式-结构型模式

设计模式-结构型模式

适配器模式

适配器模式也叫 封装器模式、Wrapper、Adapter

假如你正在开发一个接口。接口要求返回一定的数据给前端。

在开发过程中原先只需要在orm中查询。 新需求需要程序中整合一个第三方api。 但是遇到了一个问题,接口只返回兼容 JSON 格式的数据。

可以去修改第三方api源码 但是坏情况 并没有源码

所以说需要通过适配器去整合两部分结构

适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至察觉不到适配器的存在。 例如, 你可以使用一个将所有数据转换为英制单位 (如英尺和英里) 的适配器封装运行于米和千米单位制中的对象。

import  json[......]

继续阅读

常见的设计模式-创作型模式

常见的设计模式-创作型模式

个人理解面向对象

从对象的角度去处理事情

一个做饭的例子:

比如要做一道好吃的鱼香肉丝。我们脑子里想到的是洗、切、炒之类的具体步骤就是面相过程思维

若是想到先用刀然后拿锅炒菜就是面相对象思维

设计模式是干什么的

设计模式的目的是更好的组织你的代码

创建型模式

创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。

工厂方法

工厂模式使用特殊的方法来代替原本类中的构造函数的使用

比如需要初始化一个sqlalchemy连接但是根据业务的不同要能个连接到不同的


\#产品 class Mysql(object): """mysql对象 """[......]

继续阅读

为flask创建扩展

为flask创建扩展

对于flask的扩展我们已经很熟悉了,例如flask-corf等
其实从根本来说flask的扩展就是程序包。一些是为flask 增加功能,另一些是将一些功能附加到flask上

扩展的命名

命名要以flask开头加上你的功能扩展 比如本次的例子就是flask-slowlogger 就是用来记录慢相应日志的

创建规范的项目目录

为了规范化一个可以公共使用的项目你可以从这里导入一个通用的模版文件
https://github.com/pypa/sampleproject

目录文件介绍

编写扩展类,扩展的入口

class SlowLogger(object):
    def __ini[......]

继续阅读

python-socketio 多进程部署

python-socketio 多进程部署

实现原理

当使用多进程的时候。多个socketio服务器通过消息队列来沟通之间的客户端sid。若发现该sid在自己的连接中。就由该进程处理发送给其下面连接的客户端

详细的可以看这里

socket.io要实现多进程以及广播,房间等功能,势必需要接入一个redis之类的消息队列,进而socket.io的emit会调用对应队列管理器pubsub_manager的emit方法,比如用redis做消息队列则最终调用 redis_manager中的_publish()

方法通过redis的订阅发布功能将消息推送到flask_socketio频道。另一方面,每个进程在初始化时都订阅了[……]

继续阅读

利用python-opencv生成视频帧数控制,和常见错误总结

利用python-opencv生成视频帧数控制,和常见错误总结

首先呢 利用opencv生成视频的例子相信网络上已经很多了。但是大多数例子都只是捕获一个摄像头就没了。但是在实际运用中会发现。因为涉及到图像处理,生成的视频要不就就是过快要不就是比实际时间长。

控制视频的帧数,捕获摄像头和生成图像都适用

关键在于在生成一帧的时候与下一帧的间隔时间。中间图像处理会造成延迟所以说会造成视频时间比预想的长

 #计算处理时间
    sleeptime = time.time() - now
    #计算每一帧要延迟的时间
    sleeptime = 1 / fps - sleeptime
import time
import datetime
imp[......]

继续阅读

面试题 基础

面试题 基础

自己不会的做记录

如何实现字符串的反转?name=”lzx”,请反转为name=’xzl’

name = 'lzx'
name = list(name)
name.reverse()
name ="".join(name)
print(name)

1,2,3,4,5 能组成多少互不相同且无重复的三位数

counter=0
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if i !=j and j !=k and k !=i:[......]

继续阅读

关于python反射的getattr,我终于想通了!

关于python反射的getattr,我终于想通了!

其实看了getattr 的解释一直不知道到底该怎么用才好。心想这直接调用就好干嘛这么麻烦

getattr(object, name[, default]) -> value 
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. 
When a default argument is given, it is returned when the attribute doesn't 
exist; without it, an exception is raised in that case[......]

继续阅读

啥是个链表?

啥是个链表?

今天被问到个问题栈,队列,链表都是啥。看到链表老夫腚眼一紧直接懵了啊。我这带专人没有数据结构这课啊。(突然想起java学过)本这出现一个敌人打倒一个敌人的原则今天赶紧整一下。

啥是个链表?

链表就是一种常见的数据结构。和列表一样也是一种线性的数据结构。他的元素节点保存两个值。一个是本身元素的值另一个是下一个元素的地址。[……]

继续阅读

redis相关知识

redis相关知识

redis和memcached比较?

使用redis有哪些好处?

  1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
  2. 支持丰富数据类型,支持string,list,set,sorted set,hash
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
  4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

redis相比memcached有哪些优势?

  1. memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
  2. redis的速度比memcac[……]

    继续阅读

sql基础问题

sql基础问题

问题来源 https://www.cnblogs.com/wupeiqi/articles/5729934.html

解题答案 https://www.cnblogs.com/wupeiqi/articles/5748496.html

虽然已经有了解题答案但是还是要通过自己再过一遍加深自己的理解与思想。

导出数据库数据

mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据
mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构

导入现有数据库数据:

mysqldump -uroot -p密码 数据库名称 < 文件[……]

继续阅读