OOP 面向对象反射

# __call__方法
# class Foo(object):
# def __call__(self, *args, **kwargs):
# return "i am call"
#
#
# f = Foo() # f 是Foo的对象
# print(f()) # f() 对象加括号执行当前对象下__call__ 函数 # __setattr__ , def __getattr__ 属性的创建 赋值 提取
# class Foo(object):
# # 属性赋值
# def __setattr__(self, key, value):
# print(f'{key},{value}')
#
# # def __getattr__(self, key, value):
# # print(key)
# # 获取属性名
# def __getattribute__(self, item):
# print(item) # f = Foo()
# 调用__setattr__ 方法;属性的创建及赋值
# f.name = "anwen" # 对象.name 对象打点调属性
# 调用__getattribute__ 方法
# f.name # __setitem__ __getitem__
class Foo(object):
# 字典的键值
def __setitem__(self, key, value):
# name anwen
print(key, value) # 字典的键
def __getitem__(self, item):
print(item) f = Foo()
# 调用 __setitem__ 方法;
f["name"] = "anwen"
# 调用__getitem__ 方法;获取的是字典的键
print(f["name"])

偏函数

from functools import partial

# def abfunc(a, b):
# print("a:", a)
# print("b:", b)
# return a + b
#
# # 将原函数和原函数接收的参数一并存放,返回新函数 在执行新函数时 将参数传入原函数中一并执行
# new_ab = partial(abfunc, a=2, b=3)
# print(new_ab)
# print(new_ab()) # 传入 x ,等待计算
def abfunc(a, b, x):
print("a:", a)
print("b:", b)
return a + b + x # 将原函数和原函数接收的参数一并存放,返回新函数, 在执行新函数时 将参数传入原函数中一并执行
new_ab = partial(abfunc, x=4)
print(new_ab)
print(new_ab(2, 3))

线程安全

import time
import copy
from copy import deepcopy
from threading import Thread, get_ident class Foo(object):
pass f = Foo()
f.num = 0
local_dic = {}
# {
# get_ident():{f.num:1},
# get_ident():{f.num:2},
# get_ident():{f.num:3},
# } def add(i):
# print(get_ident())
# 极快解决阻塞问题,保证公共对象的安全性;但是浪费了很多内存,空间换时间
local_dic[get_ident()] = deepcopy(f)
local_dic[get_ident()].num = i
f.num = i
time.sleep(1)
print(local_dic[get_ident()].num) for i in range(20):
# 多线程操作同一个对象, 出现线程不安全
task = Thread(target=add, args=(i,))
# add(i)
task.start()

线程安全 local

import time
from threading import Thread, local # 继承local 解决线程安全问题,还不浪费资源
class Foo(local):
pass f = Foo()
f.num = 0 def add(i):
f.num = i
time.sleep(1)
print(f.num) for i in range(20):
# 多线程操作同一个对象, 出现线程不安全
task = Thread(target=add, args=(i,))
# add(i)
task.start()

请求上下文 阅读源码

# 请求是如何到达Flask应用的
from werkzeug.wrappers import Request, Response
from werkzeug import run_simple @Request.application
def app(env):
print(env, type(env))
return Response("200 ok") # 函数+()运行 run_simple("127.0.0.1", 5000, app)

Flask 进阶的更多相关文章

  1. Flask进阶

    Threading.local 作用:为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离). 应用: flask上下文管理中的local中比这更高级,为协程. DBUtils ...

  2. Flask 进阶session和上下文管理解析

    session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...

  3. Flask 进阶二

    flask中的路由系统: endpoint:反向url地址,默认为视图函数名(url_for). from flask import Flask,url_for app = Flask(__name_ ...

  4. Flask的Context(上下文)学习笔记

    上下文是一种属性的有序序列,为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等. 比如在计算机中,相对于进程而言,上下文就是进 ...

  5. Flask:文件配置方式实践及其中的各种问题记录

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2, 提示: 1.请查看本文后面的“18-07-17  11:18重大纠正” ! 2.flask run命令运行时传入参数 ...

  6. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  7. Django和Flask相对总结目录

    Django中文文档官网:https://yiyibooks.cn/xx/Django_1.11.6/index.html Flask中文文档官网:https://dormousehole.readt ...

  8. python复习目录

    目录 一.计算机基础 二.python 2.1初始python 2.1 python基础1 2.2 python基础2 三.函数 3.1 函数进阶 3.2 函数之装饰器 3.3 递归函数之二分查找 3 ...

  9. flask 电子邮件进阶实践-用模板发送163邮件

    电子邮件进阶实践 下面来学习构建邮件的HTML正文,并使用模板组织内容. 一封电子邮件的正文可以是纯文本(text/plain),也可以是HTML格式的文本(text/html).处于全面的考虑,一封 ...

随机推荐

  1. C# 简单通信(实现文件传输)

    https://blog.csdn.net/Sayesan/article/details/82185772 之前写过一个简单通信传输,不过只有聊天的功能,现在实现了文件传输的功能,借鉴于网上一篇博客 ...

  2. shell脚本:批量修改文件名(添加/删除文件名中字符)

    添加字符 举例如下:批量创建10个随机字符串的文件,要求每个文件名后面添加_aaa,后缀名不变: [root@localhost goodboy]# ls adddbbdedf.html  baacj ...

  3. vscode-tab按键失效变为切换功能的解决方法

    有一种可能是无意中按到了ctrl+m,此时VSCode右下角会出现Tab Moves focus的字样,如下: 用ctrl + m 可以切换两种状态.没有Tab Moves focus字样的时候,就是 ...

  4. .Net Oracle TransactionScope的使用

    IIS服务器和Oracle服务器: 1.配置msdtc允许DTC访问及启用事务 2.配置msdtc程序入站出站例外 3.数据库连接字符串不能带enlist=false标识 如下这样带enlist=fa ...

  5. Docker 运行ES和Kibana

    1. docker pull image docker pull elasticsearch:6.7.2 docker pull mobz/elasticsearch-head:5 docker pu ...

  6. laydate.render报错:日期格式不合法

    在使用laydate渲染日期时: laydate.render({ elem: '#day' }); 提示日期格式不合法 需要使用 too.dateType()来包装 <input type=& ...

  7. EasyNVR摄像机网页无插件直播方案H5前端构建之:区分页面是自跳转页面还是分享页面

    背景分析 EasyNVR整套方案的架构中,涉及到前端设备(摄像机IPC.硬盘录像机NVR.编码器等).流媒体服务端(EasyNVR).客户端终端设备(PC.浏览器.Android.iOS.微信). 在 ...

  8. ubuntu16.04+cuda8.0+cudnn6.0安装mxnet(极简!+成功!)

    安装MXNet 1.安装 CUDA8.0对应的mxnet版本是mxnet-cu80(同理如果是CUDA9.0对应版本则是mxnet-cu90). 如果pip安装过慢,请参考 Ubuntu16.10下配 ...

  9. Java分布式:分布式服务框架——ZooKeeper

    Java分布式:ZooKeeper——核心概念 ZooKeeper 统一配置管理 统一命名服务 分布式锁

  10. 最常见的Java面试题及答案汇总(六)

    异常 74. throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是 ...