日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

47 单例模式 和装饰器

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 单例模式 和装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。