python之裝飾器 25 後續補充

2021-09-29 12:44:31 字數 4082 閱讀 7513

# -*- 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 ...