閉包 裝飾器 元類 實現ORM

2021-09-24 08:00:05 字數 2942 閱讀 3819

# 定義乙個函式

deffirst

(k, b):

# 再定義乙個內部函式,內部函式用到了外部函式的引用

defsecond

(x):

print(k * x + b)

# 這裡就是閉包的結果

return second

f = first(2, 3)

f(1)

f(2)

f(3)

複製**

**需要遵循的就是開放封閉原則,簡單來說,它規定已經實現的功能**不允許被修改,但可以被擴充套件。

例:有乙個test函式,需要新增功能,但不能改其**,可以使用裝飾器來實現。

def

set_func

(num):

defcall_func

(): print("新增功能區......")

num()

return call_func

@set_func # 此裝飾器就等於函式呼叫test = set_func(test)

deftest

(): print("原始**區......")

# test = set_func(test) # 此功能就等於裝飾器 @set_func

test()

複製**

引入日誌

函式執行時間統計

執行函式前預備處理

執行函式後清理處理

許可權校驗等場景

快取最終可演化為:

def

set_func

(func):

defcall_func

(*args, **kwargs):

print("前校檢功能區......")

func(*args, **kwargs)

print("後清理功能區......")

return call_func

@set_func

deftset1

(*args, **kwargs):

print("原始**區......")

deftset2

(*args, **kwargs):

print("原始**區......")

test1(*args, **kwargs)

test2(*args, **kwargs)

複製**

例:

def

set_func1

(func):

print("裝飾了1......")

defcall_func

(*args, **kwargs):

print("前校檢1區......")

func(*args, **kwargs)

return call_func

defset_func2

(func):

print("裝飾了2......")

defcall_func

(*args, **kwargs):

print("前校檢2區......")

func(*args, **kwargs)

return call_func

defset_func3

(func):

print("裝飾了3......")

defcall_func

(*args, **kwargs):

print("前校檢3區......")

func(*args, **kwargs)

return call_func

@set_func1

@set_func2

@set_func3

deftset

(*args, **kwargs):

print("原始**區......")

test(*args, **kwargs)

# 執行結果

裝飾了3......

裝飾了2......

裝飾了1......

前校檢1區......

前校檢2區......

前校檢3區......

原始**區......

複製**

在python中,類就是一組用來描述如何生成乙個物件的**段,同時,類也是一種物件。

因為類也是物件,你可以在執行時動態的建立它們,就像其它任何物件一樣,最常見的就是class關鍵字,還有就是type關鍵字。

type平時用來檢視乙個物件的型別,而它還有一種完全不同的功能,就是動態的建立類。

class

test:

# 定義了乙個test類

pass

test() # 建立了乙個test類的例項物件

# 列印結果:<__main__.test at 0x10d3f8438>

複製**

可以手動像這樣建立:

type("test2",(), {}) # 定義了乙個test2類

test2() # 建立了乙個test2類的例項物件

# 列印結果:<__main__.test at 0x10d3f8438>

複製**

當然還可以手動建立帶有引數和方法的類

元類就是相似於類的父類,其目的就是為了當建立類是能後自動的改變類。

攔截類的建立

修改類返回修改之後的類

元類就是深度的魔法,99%的使用者不必為此操心。

orm是python程式語言後端web框架django的核心思想,即物件關係對映,簡稱orm。

所謂的orm就是讓開發者在運算元據庫的時候,能夠像操作物件時通過***.屬性=yyy一樣簡單,這是開發orm的初衷

只不過orm的事項較為複雜,django中已經實現了很複雜的操作,它是基於元類完成的。

閉包 裝飾器

外部函式返回內部函式的引用 內部函式可以直接使用外部函式的環境變數 語法 外部函式通過返回內部函式的引用 內部函式可以直接使用外部函式的 環境變數 自由變數 函式執行時間統計 執行函式前預備處理 執行函式後清理功能 許可權校驗等場景 快取有且只有乙個引數 指向了被裝飾的函式的引用 使用裝飾器 裝飾器...

閉包,裝飾器

多層函式巢狀,函式裡面還有定義函式,一般是兩個 往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨 更輕量,既有資料又有執行資料的 比普通函式功能更強大,不僅有 還有資料 利用閉包的基本原理,對乙個目標函式進行裝飾,即在執行乙個目標函式...

閉包 裝飾器

定義乙個函式 def test number 在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式及用到的一些變數稱之為閉包 def test in number in print in text in 函式,number in is d number in return nu...