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

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应用的

···

猜你喜欢

转载自www.cnblogs.com/luyi84895838/p/12192999.html
今日推荐