Python一直都屬於用,沒有去系統學習過,在一次代碼review中見到了@符號,回來看了下,這個符號用於裝飾器中,用於修飾一個函數,把被修飾的函數做爲參數傳遞給裝飾器,下面舉幾個例子:python
1. @classmethod和@staticmethod函數
這兩個含義很明顯,在定義方法的時候@classmethod表示該方法是類方法,類方法必須有一個參數爲cls,表示類自己,實例方法的第一個參數是self.@staticmethod修飾的方法基本上和一個全局函數相同。學習
這兩個修飾的方法經過實例和類調用都是能夠的blog
class A(): @classmethod def classM(cls): print "class method, and invoker:",cls.__name__ @staticmethod def staticM(): print "static method" class B(A): pass A.classM() #class method, and invoker: A B.classM() #class method, and invoker: B A.staticM() #static method B.staticM() #static method a=A() a.classM() #class method, and invoker: A a.staticM() #static method b=B() b.classM() #class method, and invoker: B b.staticM() #static method
2. 做爲普通的修飾符,下面的定義相似於 testone=func(testone)get
class C(): def func(fn): def test(*args): print "hello" return test @func def testone(a,b): print a**2+b**2 if __name__=="__main__": testone(3,4) #output:hello
class C(): def func(fn): def test(*args): print "hello" fn(*args) return test @func def testone(a,b): print a**2+b**2 if __name__=="__main__": testone(3,4) #output: hello 25
3. 不常見的寫法,用來修飾一個class,在單例模式中能用到class
def singleton(cls): instance={} def getinstance(): if cls not in instance: instance[cls]=cls() return instance[cls] return getinstance @singleton class Myclass: pass #output >>> my1=Myclass() >>> print my1 <__main__.Myclass instance at 0x00000000028C2F48> >>> my2=Myclass() >>> print my2 <__main__.Myclass instance at 0x00000000028C2F48>