閉包、裝飾器、元類、實現ORM

1. 閉包

什麼是閉包

# 定義一個函數
def first(k, b):
    # 再定義一個內部函數,內部函數用到了外部函數的引用
    def second(x):
        print(k * x + b)
    # 這裏就是閉包的結果
    return second


f = first(2, 3)
f(1)
f(2)
f(3)
複製代碼

代碼須要遵循的就是開放封閉原則,簡單來講,它規定已經實現的功能代碼不容許被修改,但能夠被擴展。python

  • 封閉:已實現的功能代碼塊
  • 開放:對擴展開發

2. 裝飾器

2.1 閉包基礎而生的裝飾器

例:有一個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()
複製代碼

2.2 裝飾器的功能

  1. 引入日誌
  2. 函數執行時間統計
  3. 執行函數前預備處理
  4. 執行函數後清理處理
  5. 權限校驗等場景
  6. 緩存

2.3 裝飾器中的函數

  • 無參的函數:如上述
  • 有參的函數:有什麼參數傳什麼參數
  • 多參及多種參數:用*args和**kwargs接收
  • 有return:加上return,還可用變量接收後再return
  • 一個裝飾器可對多個函數進行裝飾

最終可演化爲:數據庫

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區......
原始代碼區......
複製代碼

3. 元類

3.1 類也是對象

在python中,類就是一組用來描述如何生成一個對象的代碼段,同時,類也是一種對象。後端

3.2 動態的建立類

由於類也是對象,你能夠在運行時動態的建立它們,就像其它任何對象同樣,最多見的就是class關鍵字,還有就是type關鍵字。緩存

3.3 使用type建立類

type平時用來查看一個對象的類型,而它還有一種徹底不一樣的功能,就是動態的建立類。閉包

  • type能夠接受一個類的描述做爲參數,而後返回一個類。
  • type(類名,由父類名稱組成的元組(針對繼承的狀況,能夠爲空),包涵屬性的字典[名稱和值]),例:
class Test: # 定義了一個Test類
    pass

Test() # 建立了一個Test類的實例對象
# 打印結果:<__main__.Test at 0x10d3f8438>
複製代碼

能夠手動像這樣建立:框架

type("Test2",(), {}) # 定義了一個Test2類
Test2() # 建立了一個Test2類的實例對象
# 打印結果:<__main__.Test at 0x10d3f8438>
複製代碼

固然還能夠手動建立帶有參數和方法的類編程語言

注意:

  • type的第二個參數,元組中是父類的名字,而不是字符串
  • 添加的屬性是類屬性,並非實例屬性

3.4 元類

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

  1. 攔截類的建立
  2. 修改類
  3. 返回修改以後的類

元類就是深度的魔法,99%的用戶沒必要爲此操心。

4. ORM

4.1 什麼是ORM

ORM是Python編程語言後端web框架Django的核心思想,即對象關係映射,簡稱ORM。

4.2 說明

  1. 所謂的ORM就是讓開發者在操做數據庫的時候,可以像操做對象時經過xxx.屬性=yyy同樣簡單,這是開發ORM的初衷
  2. 只不過ORM的事項較爲複雜,Django中已經實現了很複雜的操做,它是基於元類完成的。
相關文章
相關標籤/搜索