python閉包,接口,類繼承的淺析

閉包:

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參數

3:Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。(先在本類中查找調用的方法,找不到纔去基類中找)。

基類:
#!/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函數包起來執行,先驗證後執行。




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章