# 定義乙個函式
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...