【@】符號(hào)在python中是裝飾器的意思。
“專(zhuān)業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來(lái)堅(jiān)持追求的企業(yè)文化。 創(chuàng)新互聯(lián)是您可以信賴(lài)的網(wǎng)站建設(shè)服務(wù)商、專(zhuān)業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專(zhuān)注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、軟件開(kāi)發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺(jué)傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專(zhuān)業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!
裝飾器對(duì)一個(gè)可調(diào)用對(duì)象(函數(shù)、方法、類(lèi)等等)進(jìn)行裝飾,它返回的也是一個(gè)可調(diào)用對(duì)象。
一般情況下,裝飾器是對(duì)被裝飾對(duì)象的修飾與增強(qiáng)。用現(xiàn)實(shí)事物類(lèi)比的話,可以類(lèi)比為中間商:中間商不生產(chǎn)產(chǎn)品,它將工廠生產(chǎn)的產(chǎn)品進(jìn)行包裝、運(yùn)輸后再銷(xiāo)售給顧客。裝飾器不實(shí)現(xiàn)核心功能,它提供對(duì)目標(biāo)函數(shù)調(diào)用的封裝與強(qiáng)。
它裝飾的方法返回值是一個(gè)對(duì)象(BillList、Bill、List[BillDetail]等),而裝飾器【enabled_cache】的作用如它的名稱(chēng)一樣:使用緩存??梢钥吹剑@個(gè)裝飾器函數(shù)中定義了一個(gè)函數(shù)【wrapper】然后將這個(gè)wrapper作為返回值。這樣,原本調(diào)用ProductionBos.bill_with_last_week的代碼就不需要做任何改變就能享受到ProductionBos.bill_with_last_week原有的功能(得到一個(gè)BillList對(duì)象)和enabled_cache提供的附加功能(如果該對(duì)象有緩存,就不再?gòu)臄?shù)據(jù)庫(kù)查詢(xún))。
classmethod:類(lèi)方法staticmethod:靜態(tài)方法
在python中,靜態(tài)方法和類(lèi)方法都是可以通過(guò)類(lèi)對(duì)象和類(lèi)對(duì)象實(shí)例訪問(wèn)。但是區(qū)別是:
@classmethod 是一個(gè)函數(shù)修飾符,它表示接下來(lái)的是一個(gè)類(lèi)方法,而對(duì)于平常我們見(jiàn)到的則叫做實(shí)例方法。 類(lèi)方法的第一個(gè)參數(shù)cls,而實(shí)例方法的第一個(gè)參數(shù)是self,表示該類(lèi)的一個(gè)實(shí)例。
普通對(duì)象方法至少需要一個(gè)self參數(shù),代表類(lèi)對(duì)象實(shí)例
類(lèi)方法有類(lèi)變量cls傳入,從而可以用cls做一些相關(guān)的處理。并且有子類(lèi)繼承時(shí),調(diào)用該類(lèi)方法時(shí),傳入的類(lèi)變量cls是子類(lèi),而非父類(lèi)。 對(duì)于類(lèi)方法,可以通過(guò)類(lèi)來(lái)調(diào)用,就像C.f(),有點(diǎn)類(lèi)似C++中的靜態(tài)方法, 也可以通過(guò)類(lèi)的一個(gè)實(shí)例來(lái)調(diào)用,就像C().f(),這里C(),寫(xiě)成這樣之后它就是類(lèi)的一個(gè)實(shí)例了。
靜態(tài)方法則沒(méi)有,它基本上跟一個(gè)全局函數(shù)相同,一般來(lái)說(shuō)用的很少
Example 1:
class a():
@staticmethod
def staticm():
print 'static'
def normalm(self):
print 'nomarl',self
@classmethod
def classm(cls):
print 'class',cls
a1=a()
a1.normalm()
nomarl __main__.a instance at 0x84dddec
a1.staticm()
static
a1.classm()
class __main__.a
type(a)
type 'classobj'
type(a1)
type 'instance'
Example 2:
class A(object):
@classmethod
def cm(cls):
print '類(lèi)方法cm(cls)調(diào)用者:', cls.__name__
@staticmethod
def sm():
print '靜態(tài)方法sm()被調(diào)用'
class B(A):
pass
A.cm()
B.cm()
A.sm()
B.sm()
輸出:
類(lèi)方法cm(cls)調(diào)用者: A
類(lèi)方法cm(cls)調(diào)用者: B
靜態(tài)方法sm()被調(diào)用
靜態(tài)方法sm()被調(diào)用
@classmethod與@staticmethod的應(yīng)用實(shí)例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class TClassStatic(object):
obj_num = 0
def __init__(self, data):
self.data = data
TClassStatic.obj_num += 1
def printself(self):
print("self.data: ", self.data)
@staticmethod
def smethod():
print("the number of obj is : ", TClassStatic.obj_num)
@classmethod
def cmethod(cls):
print("cmethod : ", cls.obj_num)
cls.smethod()
def main():
objA = TClassStatic(10)
objB = TClassStatic(12)
objB.printself()
objA.smethod()
objB.cmethod()
print("------------------------------")
TClassStatic.smethod()
TClassStatic.cmethod()
if __name__ == "__main__":
main()123456789101112131415161718192021222324252627282930313233
輸出結(jié)果如下:
('self.data: ', 12)
('the number of obj is : ', 2)
('cmethod : ', 2)
('the number of obj is : ', 2)
------------------------------
('the number of obj is : ', 2)
('cmethod : ', 2)
('the number of obj is : ', 2)
修飾符,比如說(shuō)
class A:
@staticmethod
def m(self):
pass
就相當(dāng)于
class A:
def m(self):
pass
m = staticmethod(m)
其實(shí)就是一調(diào)用一個(gè)函數(shù)參數(shù)為下行的變量,并且替換它
擴(kuò)展資料:
函數(shù)修飾符
@用做函數(shù)的修飾符,可以在模塊或者類(lèi)的定義層內(nèi)對(duì)函數(shù)進(jìn)行修飾,出現(xiàn)在函數(shù)定義的前一行,不允許和函數(shù)定義在同一行。
一個(gè)修飾符就是一個(gè)函數(shù),它將被修飾的函數(shù)作為參數(shù),并返回修飾后的同名函數(shù)或其他可調(diào)用的東西。
在Python的函數(shù)中偶爾會(huì)看到函數(shù)定義的上一行有@functionName的修飾,當(dāng)解釋器讀到@這樣的修飾符的時(shí)候會(huì)優(yōu)先解除@后的內(nèi)容,直接就把@的下一行的函數(shù)或者類(lèi)作為@后邊函數(shù)的參數(shù),然后將返回值賦給下一個(gè)修飾的函數(shù)對(duì)象。
參考資料來(lái)源:百度百科-Python (計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言)