线程安全,偏函数和面向对象补充

flask进阶

什么是线程安全

极快的解决阻塞,保证公共对象的安全性。
浪费非常严重的资源

时空转换:使用空间换取时间
原理:
    class Foo(object):
        pass

    f=Foo()

    f.num=0


    dic={}

    def add(i):
        f.num=i
        # print(get_ident())
        dic[get_ident()]=deepcopy(f)
        time.sleep(1)
        print(dic[get_ident()].num)

    for i in range(20):
        task=Thread(target=add,args=(i,))
        task.start()
使用local:
    class Foo(local):
        pass

    f=Foo()

    f.num=0
    def add(i):
        f.num=i
        # print(get_ident())
        time.sleep(1)
        print(f.num)


    for i in range(20):
        task=Thread(target=add,args=(i,))
        task.start()

什么是偏函数

将原函数和原函数接收的参数一并存放. 返回新函数,在执行新函数时,将参数传入原函数中一并执行
from functools import partial
def abfunc(a,b):
    return a+b
newab=partial(abfunc,2,3)
print(newab)
print(newab())

面向对象(oop)

__call__方法

类实例化对象加()  执行类的__call__方法
class Foo(object):
    def __call__(self, *args, **kwargs):
        # print("aaaa")
        return "BBB"
f=Foo()
f()

属性的创建,赋值,提取

创建

class Foo(object):
    pass
f=Foo()
f.name="alexdsb"

_setattr_

class Foo(object):
	pass

f=Foo()
f.name=123

使用类实例化对象.属性的时候调用的是__setattr__

_getattr_

class Foo(object):
	pass

f=Foo()
f.name=123
f.name

在类里没有name属性,没有静态属性,在__init__没有初始化name方法时.使用实例化对象.属性名 是调用__getattr__ (__getattribute__)

_setitem_

class Foo(object):
	pass

f=Foo()
f[name]=123

使用f[name]=123 增加属性时,调用__setitem__方法

_getitem_

class Foo(object):
	pass

f=Foo()
f[name]=123
f[name]

使用f[name] 获取属性时,调用__getitem__方法

请求上下文

请求是如何到达flask应用的

···

posted @ 2020-01-14 17:04  路一  阅读(139)  评论(0编辑  收藏  举报