# 定義一個函數
def first(k, b):
# 再定義一個內部函數,內部函數用到了外部函數的引用
def second(x):
print(k * x + b)
# 這裏就是閉包的結果
return second
f = first(2, 3)
f(1)
f(2)
f(3)
複製代碼
代碼須要遵循的就是開放封閉原則,簡單來講,它規定已經實現的功能代碼不容許被修改,但能夠被擴展。python
例:有一個test函數,須要添加功能,但不能改其代碼,可使用裝飾器來實現。web
def set_func(num):
def call_func():
print("添加功能區......")
num()
return call_func
@set_func # 此裝飾器就等於函數調用test = set_func(test)
def test():
print("原始代碼區......")
# test = set_func(test) # 此功能就等於裝飾器 @set_func
test()
複製代碼
最終可演化爲:數據庫
def set_func(func):
def call_func(*args, **kwargs):
print("前校檢功能區......")
func(*args, **kwargs)
print("後清理功能區......")
return call_func
@set_func
def tset1(*args, **kwargs):
print("原始代碼區......")
def tset2(*args, **kwargs):
print("原始代碼區......")
test1(*args, **kwargs)
test2(*args, **kwargs)
複製代碼
例:編程
def set_func1(func):
print("裝飾了1......")
def call_func(*args, **kwargs):
print("前校檢1區......")
func(*args, **kwargs)
return call_func
def set_func2(func):
print("裝飾了2......")
def call_func(*args, **kwargs):
print("前校檢2區......")
func(*args, **kwargs)
return call_func
def set_func3(func):
print("裝飾了3......")
def call_func(*args, **kwargs):
print("前校檢3區......")
func(*args, **kwargs)
return call_func
@set_func1
@set_func2
@set_func3
def tset(*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。