閉包:
1.閉包的概念:當一個函數返回一個函數,且內部函數可以使用外部函數變量的行爲,就叫閉包。如下所示:
def foo():
m=3;
n=4;
def bar():
a=5;
return m+n+a;
return bar;
閉包可以被理解爲一個只讀的對象,你可以給他傳遞一個屬性,但它只能提供給你一個執行的接口。因此在程序中我們經常需要這樣的一個函數對象——閉包,來幫我們完成一個通用的功能,比如後面會提到的——裝飾器。
使用閉包
第一種場景 ,在python中很重要也很常見的一個使用場景就是裝飾器,Python爲裝飾器提供了一個很友好的“語法糖”——@,讓我們可以很方便的使用裝飾器,裝飾的原理不做過多闡述,簡言之你在一個函數func上加上@decorator_func, 就相當於decorator_func(func):
def decorator_func(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator_func
def func(name):
print 'my name is', name
# 等價於
decorator_func(func)
在裝飾器的這個例子中,閉包(wrapper)持有了外部的func這個參數,並且能夠接受外部傳過來的參數,接受過來的參數在原封不動的傳給func,並返回執行結果。
def ret_func(a):
def func():
return a
return func
func1 = ret_func(2)
func1()
閉包有什麼用:
惰性求值 || 延遲求值 || 在一系列函數調用中保持某個狀態
閉包會捕捉內部函數的環境,因爲可用於包裝現有函數。
類(python中是多繼承)
在python中繼承中的一些特點:
1:在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。有別於C#
2:在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別於在類中調用普通函數時並不需要帶上self參數
基類:
#!/usr/bin/python
#FileName:BaseModel.py =>模塊名
class BaseClass:
def __init(self,name,age):
self.name=name
self.age=age
print "baseclass is inited "
def speak(self,name):
print "base class is speak:%s" %name
if __name__=="__main__":
b=BaseClass()
子類:
#!/usr/bin/python
#FileName:SubClass.py =>模塊名
import BaseModel
class SubClass(BaseModel.BaseClass):
def __init__(self,name,age,salary):
BaseModel.BaseClass.__init__(self,name,age)
self.salary=salary
print "SubClass is inited and the salary is :%s"%self.salary
def talk(self,sth):
print "%s talking %s"%(self.name,sth)
BaseModel.BaseClass.speak(self.sth)
if __name__=="__main__":
s=SubClass("Joan",1,800)
s.talk("a story")
若子類中不寫初始化函數會調用父類中的初始化函數。
接口:
接口只是定義了一些方法,沒有去實現,在python中接口由抽象類和抽象方法實現,接口是不能實例化的,只能由別的類繼承去實現相應的功能。
特點:
1.子類必須要有父類的方法 2.子類實現的方法必須跟父類的方法的名字一樣
裝飾器
裝飾器本質上是一個python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。它經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限驗證等場景,裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是爲已經存在的對象添加額外的功能。
裝飾器的實現原理:
#無參數裝飾器原理: def login(funct): print('passed user veriftcation...') return funct #函數返回形參的值或內存地址 def tv(): print('welcom to TV page') tvv= login(tv) #執行login函數,參數tv返回tv函數的內存地址 tvv() #執行生成器函數將執行tv函數傳參裝飾器原理
#實例:實現程序執行前的驗證 def login(funct): #驗證函數 def inner(arg): #嵌套函數是爲了不讓驗證函數不執行 print('passed user veriftcation...') funct(arg) return inner #將內嵌函數內存地址返回給login @login #@是裝飾器的語法糖,它實際就是等於tv=login(tv) def tv(name): #執行程序函數 print('welcom %s to TV page' %name) #tv = login(tv) #相當與@login,與裝飾器的作用一樣 tv('zhang') #執行程序前,通過裝飾器驗證 #上面程序執行原理說明: #程序執行後,首先掃描程序內的裝飾器(@login)執行後,跳轉到裝飾器函數 #將函數讀取到內存,login將返回inner函數的內存地址,執行tv時,首先執行inner函數,tv參數‘zhang’傳遞給inner,打印輸出,funct參數值爲tv,執行funct後就會執行tv函數。理解裝飾器原理就是把tv函數包起來執行,先驗證後執行。