1. 程式人生 > >Python裝飾器與函數語言程式設計

Python裝飾器與函數語言程式設計

一、函數語言程式設計

“函數語言程式設計”同“面向物件程式設計”,“面向過程程式設計”一樣是一種程式設計正規化,它屬於”結構化程式設計”的一種,主要思想是把運算過程儘量寫成一系列巢狀的函式呼叫。相比於面向物件,函數語言程式設計的最大優點在於將計算機運算看做是數學中函式的計算,並且避免了狀態以及變數的概念,關於函數語言程式設計的更多知識還有待於學習,這裡先埋個坑,以後再補。

二、閉包

簡單來說,閉包是是引用了自由變數的函式,閉包包含自由(未繫結到特定物件)變數;這些變數不是在這個程式碼塊內或者任何全域性上下文中定義的,而是在定義程式碼塊的環境中定義(區域性變數)。例如以下例子:

def addX
(x):
def addY(y): return x+y return addY

在上述程式碼中,x就是自由變數,addY就是一個閉包,我們可以利用數學中的複合函式概念幫助我們理解閉包,即f(g(x)),給定一個引數x,先呼叫函式g(x)返回一個值,當做函式f的引數,最後再進行呼叫。

三、裝飾器

Python中裝飾器的作用對應於OOP中的裝飾模式,他可以在不改變一個函式原有功能的基礎上給函式動態的增加功能,這也是函數語言程式設計的優勢所在,可以在不修改原始碼的基礎上,利用最簡單明瞭的方法給函式動態增加功能。關於裝飾器的更詳細說明可以參考廖雪峰Python教程

接下來舉一個例子幫助理解python裝飾器。

def connect(function):
    @functools.wraps(function)
    def wrapper(obj,*args,**kwargs):
        function(obj,args,kwargs)
        print(" is connected")
    return wrapper

@connect
def click(obj,*args,**kwargs):
    print("{} is clicked".format(obj))

click("button") #button is clicked is connected

在上述程式碼中,我們利用python的語法糖@,在函式前加@connect相當於呼叫click = connect(click)
此時的click其實是返回的wrapper函式,於是我們可以在wrapper函式的定義中給函式做一些額外的工作增加其功能。此時的click其實是wrapper,當我們呼叫click._name_方法獲取函式名時我們會發現結果為wrapper,為了防止有些用到函式簽名的方法,我們引入@functools.wraps(function)修改函式名。

當我們的裝飾器本身需要傳入引數時,我們可以給connect函式再包裝一層:

def connect_with(slot:str):
    def connect(function):
        @functools.wraps(function)
        def wrapper(obj, *args, **kwargs):
            function(obj, args, kwargs)
            print("{} is connected".format(slot))
        return wrapper
    return connect

@connect_with("measure")
def click(obj,*args,**kwargs):
    print("{} is clicked".format(obj))

click("button")     #輸出為button is clicked   measure is connected

這時,我們在函式前加@connect_with(slot),相當於執行了click = connect_with(“measure”)(click)
我們可以從外到裡一步一步解析,connect_with(“measure”)返回connect函式,於是connect_with(“measure”)(click)相當於connect(click),connect(click)函式返回wrapper函式,於是呼叫click函式就相當於呼叫了wrapper函式,當我們去掉@functools.wraps(function)裝飾器列印函式click的名字時我們就會發現他其實是wrapper函式。

Python支援面向物件,面向過程以及部分函數語言程式設計,我們可以在程式中靈活運用,這樣可以大大提高開發效率。剛看完這麼一個強大的功能,現在就去用用看,不說了0.0

相關推薦

Python裝飾語言程式設計

一、函數語言程式設計 “函數語言程式設計”同“面向物件程式設計”,“面向過程程式設計”一樣是一種程式設計正規化,它屬於”結構化程式設計”的一種,主要思想是把運算過程儘量寫成一系列巢狀的函式呼叫。相比於面向物件,函數語言程式設計的最大優點在於將計算機運算看做是數

Python裝飾語言程式設計

        Python的修飾器的英文名叫Decorator,當你看到這個英文名的時候,你可能會把其跟Design Pattern裡的Decorator搞混了,其實這是完全不同的兩個東西。雖然好像,他們要乾的事都很相似——都是想要對一個已有的模組做一些“修飾工作”,所謂修

python中函式語言程式設計(二)

首先要明白為什麼要用到返回值,返回值的作用就是為了分情況來處理下面的程式(個人見解總結) 1.函式返回值 def test1(): pass def test2(): return 0 def test3(): return 0,10,'hello',['

python中函式語言程式設計(一)

在學習之前,我們先去區分面對物件、面對過程、函數語言程式設計他們之間的區別,從改圖可以看出,他們之間不是完全相同的,也不是沒有任何相同點的 1.函式和過程的基本認識 def func1(): """testing1""" print('in the func1'

python中函式語言程式設計

在學習之前,我們先去區分面對物件、面對過程、函數語言程式設計他們之間的區別,從改圖可以看出,他們之間不是完全相同的,也不是沒有任何相同點的 1.函式和過程的基本認識 def func1():

Python之路-Day08語言程式設計內建函式

return可以返回任何值 當你在一個函式當中返回一個函式名的時候,其實返回的是這個函式在記憶體當中的地址,如果你用一個變數去接收它,然後以這個變數名執行的話,就會執行你返回的記憶體地址對應的那個函式. def test1(): print("in the test1")

Python學習筆記(十二):lambda表示式語言程式設計

以Mark Lutz著的《Python學習手冊》為教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話 2013-7-22 21:00 學習筆記 1,lambda的一般形式是關鍵字lambda後面跟一個或多個引數,緊跟一個冒號,以後是一個表示

01python中的函式語言程式設計python函式)

一、函式的定義與呼叫       11

Python——五分鐘理解語言程式設計閉包

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是Python專題的第9篇文章,我們來聊聊Python的函數語言程式設計與閉包。 函數語言程式設計 函數語言程式設計這個概念我們可能或多或少都聽說過,剛聽說的時候不明覺厲,覺得這是一個非常黑科技的概念。但是實際上它的含義很樸實,但是

python裝飾作用域

div 函數對象 內置 代碼復用 urn func -i fail 代碼 1.函數作用域LEGB L:local函數內部作用域 E:enclosing函數內部與內嵌函數之間 G:global全局作用域 B:build-in內置作用域 passline = 60 def f

Python包結構和語言程式設計

# 包的結構 |--包 |--|-- __init__.py 包的標誌檔案 |--|-- 模組1 |--|-- 模組2 |--|-- 子包(子資料夾) |--|--|-- __init__.py 包的標誌檔案 |--|--|-- 子包模組1 |--|--|--

Python進階:語言程式設計例項(附程式碼)

上篇文章“幾個小例子告訴你, 一行Python程式碼能幹哪些事 -- 知乎專欄”中用到了一些列表解析、生成器、map、filter、lambda、zip等表達形式,這就涉及到了Python中關於函數語言程式設計(functional programming)的語法、函式等

scala語言程式設計——什麼是語言程式設計

什麼是函數語言程式設計?   函數語言程式設計是一種面向函式和函式組合的程式設計方式。   什麼是函式?從數學的角度,函式即Function,是從集合A到集合B的一種對映關係。如果集合A中的每一個元素都對應到集合B中的某一個元素,那麼這種對映關係就叫做函式。比如每個人都有一個名字,那麼

scala語言程式設計——面向物件模式在語言程式設計下的實現

用函式組合實現設計模式   設計模式是面向物件下的產物,但其中蘊藏的程式設計理念仍然是通用的。對於面向物件的程式設計熟手而言,在程式設計時幾乎離不開常用的設計模式。在剛開始使用函數語言程式設計的時候,還會不自覺地想使用策略、裝飾器等模式,但卻不知在函數語言程式設計的世界裡,有些模式早已被

scala語言程式設計——從範疇論看語言程式設計

什麼是範疇?   生活中我們經常說:我們講的不是一個範疇裡的東西!意思就是說兩個人所講的事物不具有任何關聯,沒有相關性。其實範疇Category就是指一群事物以及這些事物之間的所有關聯關係,這些事物和這些關聯關係共同組成了某個範疇。   舉一個例子,比如在動物這個範疇中,蟬,螳螂,黃雀

Lambda表示式語言程式設計探索

Java 8引入流機制和Lambda表示式之後,兩者配合地可謂是天衣無縫,本來想看看Java流庫有什麼東西,可是全是Lambda表示式,暈死,看來得好好了解一下Lambda了! 函數語言程式設計 在文獻2中,作者由Swing中的ActionListener來引入La

python精簡筆記(五)——語言程式設計

函數語言程式設計就是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用。而允許使用變數的程式設計語言,由於函式內部的變數狀態不確定,同樣的輸入,可能

python3 lambda表示式語言程式設計

簡單來說,程式設計中提到的 lambda 表示式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式。其一般有如下幾種使用方式: 1、lambda的一般形式是關鍵字lambda後面跟一個或多個引數,緊跟一個冒號,以後是一個表示式。lambda是

Python學習筆記:語言程式設計工具

本篇參考官方文件: The PythonTutorial:5.Data Structures 函數語言程式設計可以大大簡化程式碼,本篇學習一下三個對list操作非常有用的函式: filter(),map(),reduce() filter filte

python語言程式設計3(裝飾的深入理解)

一、什麼是裝飾器 1、python中裝飾器可以理解為AOP程式設計,有點類似Spring中的註解,在不改變原函式或類的基礎上,對函式或類新增額外(自己需求補充)的功能。 2、裝飾器本質上是一個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改程式碼的前提下增加額外的功能,裝飾器的返回值也是