python學習 物件導向高階之閉包 八

2021-08-04 18:27:51 字數 2373 閱讀 2929

def

test1

(): print("--- in test1 func----")

#呼叫函式

test1()

#引用函式

ret = test1

print(id(ret))

print(id(test1))

#通過引用呼叫函式

ret()

執行結果:

--- in test1 func----

140212571149040

140212571149040

--- in test1 func----

#定義乙個函式

deftest

(number):

#在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為閉包

deftest_in

(number_in):

print("in test_in 函式, number_in is %d"%number_in)

return number+number_in

#其實這裡返回的就是閉包的結果

return test_in

#給test函式賦值,這個20就是給引數number

ret = test(20)

#注意這裡的100其實給引數number_in

print(ret(100))

#注意這裡的200其實給引數number_in

print(ret(200))

執行結果:

in test_in 函式, number_in is

100120

in test_in 函式, number_in is

200220

內部函式對外部函式作用域裡變數的引用(非全域性變數),則稱內部函式為閉包。

# closure.py

defcounter

(start=0):

count=[start]

defincr

(): count[0] += 1

return count[0]

return incr

啟動python直譯器

>>>import closeure

>>>c1=closeure.counter(5)

>>>print(c1())

6>>>print(c1())

7>>>c2=closeure.counter(100)

>>>print(c2())

101>>>print(c2())

102

nonlocal訪問外部函式的區域性變數(python3)
def

counter

(start=0):

defincr

():nonlocal start

start += 1

return start

return incr

c1 = counter(5)

print(c1())

print(c1())

c2 = counter(50)

print(c2())

print(c2())

print(c1())

print(c1())

print(c2())

print(c2())

def

line_conf

(a, b):

defline

(x):

return a*x + b

return line

line1 = line_conf(1, 1)

line2 = line_conf(4, 5)

print(line1(5))

print(line2(5))

這個例子中,函式line與變數a,b構成閉包。在建立閉包的時候,我們通過line_conf的引數a,b說明了這兩個變數的取值,這樣,我們就確定了函式的最終形式(y = x + 1和y = 4x + 5)。我們只需要變換引數a,b,就可以獲得不同的直線表達函式。由此,我們可以看到,閉包也具有提高**可復用性的作用。

如果沒有閉包,我們需要每次建立直線函式的時候同時說明a,b,x。這樣,我們就需要更多的引數傳遞,也減少了**的可移植性。

閉包思考:

1.閉包似優化了變數,原來需要類物件完成的工作,閉包也可以完成

2.由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體

python學習總結 物件導向高階

類屬性和例項屬性關係 1 類屬性和例項屬性關係 1 例項屬性 例項物件獨有的屬性 2 類屬性 類名訪問類屬性 3 例項中無同名屬性時,可訪問到類屬性,當定義同名例項屬性時,則無法訪問 4 常用的查詢指令 1 vars 檢視例項內屬性 2 dir 顯示類屬性和所有例項屬性 3 type 顯示型別 方法...

物件導向 高階

json方式的物件導向 json 把方法包在json裡 json物件導向 有人管他叫 命名空間 在公司裡 把同一類 的方法包在一起 拖拽和繼承 物件導向的拖拽 改寫原有的拖拽 繼承 asdf 拖拽 instanceof 檢視物件是某個類的例項 使用繼承 限制範圍的拖拽類 建構函式的偽裝 屬性的繼承 ...

物件導向高階

public class person public void print public class student extends person 重寫了父類方法 public void print public class demo public class demo 1.不能new這個類,只能靠...