47 单例模式 和装饰器
生活随笔
收集整理的這篇文章主要介紹了
47 单例模式 和装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.裝飾 器?
不改變被裝飾函數原來的執行方式 給原函數增加一些額外的功能,登錄驗證,打印日志,測試效率等。
?
1.簡單版裝飾器
import?time#裝飾器
def timer(f) :def inner():#被裝飾函數執行前 要做的事情
start_time = time.time()res = f() #被裝飾的函數#被裝飾函數執行后 要做的事情end_time = time.time()print("函數執行時間:",end_time-start_time)return resreturn inner @timer #相當于 func = timer(func)
#被裝飾函數
def func(x,y):
print(x+y)
return x+y
func()
2.帶參數的裝飾器
帶參數裝飾器一? ?:控制裝飾器的關和開
# 帶參數的裝飾器 可以同時控制裝飾器的啟用和關閉 import time def timmer(flag):def wrapper(f):def inner(*args, **kwargs):if flag:start_time = time.time()ret = f(*args, **kwargs)end_time = time.time()print('執行時間%s' % (end_time-start_time))return retelse:ret = f(*args, **kwargs)return retreturn innerreturn wrapperflag1 = False @timmer(flag1) # 第一步,將@ 與后面 分開,只是單純的執行timmer(flag1)函數 第二步 將@ 與 wrapper相結合,形成裝飾器 def func1():time.sleep(0.3)print('in func1')@timmer(flag1) def func2():time.sleep(0.3)print('in func2')@timmer(flag1) def func3():time.sleep(0.3)print('in func3')func1() func2() func3()帶參數裝飾器二 :?
# 做一個帶參數的裝飾器: # 訪問JD JD_shop 輸入京東的賬號密碼 # 訪問taobao tianmao_shop() 輸入支付寶的賬號密碼 status = {"username":None,"京東":False,"淘寶":False } def login(flag):def wapper(f):def inner(*args,**kwargs):if status[flag]:res = f(*args,**kwargs)return reselse:print("-----登錄頁面-------")username = input("請輸入用戶名:").strip()password = input("請輸入密碼:").strip()with open(flag,"r",encoding="utf-8") as f1:for line in f1:user,pwd = line.strip().split("|")if user.strip() == username and password == pwd.strip():status [flag] = Trueprint("登錄成功!")res = f(*args, **kwargs)return reselse:print("登錄失敗!")return innerreturn wapper@login('京東') def JD():print("-----歡迎進入京東首頁!------") @login('京東') def JD_shop():print("-----歡迎進入京東商店!------")@login('淘寶') def taobao():print("-----歡迎進入淘寶首頁!------") @login('淘寶') def tianmao_shop():print("-----歡迎進入天貓超市!------")JD() JD_shop() taobao() tianmao_shop()?
3. 多個裝飾器,裝飾同一個函數
#多個裝飾器 裝飾一個函數def wrapper1(func): # func == f 函數名def inner1():print('wrapper1 ,before func') # 2 func()print('wrapper1 ,after func') # 4return inner1def wrapper2(func): # func == inner1def inner2():print('wrapper2 ,before func') # 1 func()print('wrapper2 ,after func') # 5return inner2# 就近原則 @wrapper2 # f = wrapper2(f) 里面f == inner1 外面的f == inner2 @wrapper1 # f = wrapper1(f) 里面的f == 函數名f 外面的f == inner1 def f():print('in f') # 3 f() # inner2()二. 單例模式
#單例模式 :只能創建同一個實例對象 class A:def __new__(cls, *args, **kwargs):print(111)obj = object.__new__(cls)return objdef __init__(self):print(222) obj1 = A()class A:__instance = Nonedef __new__(cls, *args, **kwargs):if A.__instance is None:obj = object.__new__(cls)A.__instance = objreturn A.__instance obj1 = A() obj2 = A() obj3 = A() obj4 = A() print(obj1) print(obj2) print(obj3) print(obj4)?
轉載于:https://www.cnblogs.com/knighterrant/p/10159182.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的47 单例模式 和装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [CF917D]Stranger Tre
- 下一篇: 把玩Fedora29操作系统