Python的@符號

 

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>
相關文章
相關標籤/搜索