# -*- coding: utf-8 -*-# @file :
# @author: dianxiaoer
# @date : 2019/11/11
# @desc :
# python裝飾器(fuctional decorators)就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名(或類名)的情況下,給函式增加新的功能;
# 功能需求:對原函式增加計時功能
# 常規思路:
import time
# def fun():
# start_time = time.time()
# print("i love python!")
# time.sleep(2)
# print("i love python again!")
# end_time = time.time()##
# cost_time = (end_time - start_time)
# print(cost_time)
## fun()
# 然而事不遂願,在實際開發過程中,有些核心**不能隨便修改,為此,我們引入裝飾器來解決這一問題
# import time
## def deco(cal_time):
# start_time = time.time()
# cal_time()
# end_time = time.time()
# cost_time = (end_time - start_time)
# print(cost_time)
## @deco
# def cal_time():
# print("i love python!")
# time.sleep(2)
# print("i love python again!")##
# if __name__ == '__main__':
# cal_time()
# 這是最原始的裝飾器,它的引數是乙個函式,返回值也是乙個函式;
# cal_time()就相當於被注入了此功能,每次只要呼叫cal_time(),它就相當於變身為"新的功能更多的函式";
# 擴充套件一:帶有固定引數的裝飾器
# import time
## def deco(f):
# start_time = time.time()
# f(a,b)
# end_time = time.time()
# execution_time = (end_time - start_time)*1000
# print("time is %d ms" % execution_time)
## @deco
# def f(a,b):
# print("python")
# time.sleep(1)
# print("result is %d" ,(a+b))
## if __name__ == '__main__':
# f(3,4)
# 擴充套件二:無固定引數的裝飾器
# import time
## def deco(f1):
# start_time = time.time()
# f1(*args, **kwargs)
# end_time = time.time()
# execution_time_ = (end_time - start_time)*1000
# print("time is %d ms",execution_time_)##
# @deco
# def f1(a,b):
# print("python")
# time.sleep(1)
# print("result is %d" ,(a+b))
## @deco
# def f2(a,b,c):
# print("c++")
# time.sleep(1)
# print("result is %d" %(a+b+c))##
# if __name__ == '__main__':
# f1(3,4)
# f2(3,4,5)
# 擴充套件三:多個裝飾器裝飾乙個函式
# import time
## def deco01(f):
# print("this is deco01")
# start_time = time.time()
# f(*args, **kwargs)
# end_time = time.time()
# execution_time = (end_time - start_time)*1000
# print("time is %d ms" % execution_time)
# print("deco01 end here")
## def deco02(f):
# print("this is deco02")
# f(*args, **kwargs)
## print("deco02 end here")
## @deco01
# @deco02
# def f(a,b):
# print("be on")
# time.sleep(1)
# print("result is %d" %(a+b))##
# if __name__ == '__main__':
# f(3,4)
# 對於python中的 @ 語法糖,裝飾器的呼叫順序與使用 @ 語法糖宣告的順序相反;
# 不太建議使用……
# 後續補充吧,此段****於網路
# 擴充套件四:python內建裝飾器
# python有三個內建的裝飾器都與類相關
# @staticmethod 靜態類方法,其跟成員方法的區別是沒有 self 引數,並且可以在類不進行例項化的情況下呼叫
# @classmethod 與成員方法的區別在於所接收的第乙個引數不是 self (類例項的指標),而是cls(當前類的具體型別)
# @property 是屬性的意思,可以通過類例項直接訪問
# class people(object):
# def __init__(self, name):
# super(people, self).__init__()
# self._name = name
# # @property
# def name(self):
# return self._name
# # # @name.setter
# # def name(self, name):
# # self._name = name
# #
# people = people("張三")
# print(people.name)
# people.name = "李四"
# print(people.name)
# 此處如果將裝飾器 @name.setter 裝飾的成員函式去掉,則 people.name 的屬性只是可讀屬性,不能對其進行 people.name = "李四" 賦值操作,丟擲異常如下:
python裝飾器記錄供後續更改提高
關於裝飾器的理解,寫給未來的自己看!有沒有感到現在的自己幼稚。希望你有!def adomment fn print 這是用來看這個adomment動作用的 def inside print 這是另外的乙個 fn print 這是裝飾的部分 return 新的返回物件 加了裝飾器後,會返回這個新的。p...
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...