码迷,mamicode.com
首页 > 编程语言 > 详细

Python的@符号

时间:2014-10-19 22:45:28      阅读:807      评论:0      收藏:0      [点我收藏+]

标签:blog   ar   sp   div   on   log   ef   bs   as   

 

Python一直都属于用,没有去系统学习过,在一次面试中见到了@符号,回来看了下,这个符号用于装饰器中,用于修饰一个函数,把被修饰的函数作为参数传递给装饰器,下面举几个例子:

1. @classmethod和@staticmethod

这两个含义很明显,在定义方法的时候@classmethod表示该方法是类方法,类方法必须有一个参数为cls,表示类本身,实例方法的第一个参数是self.@staticmethod修饰的方法基本上和一个全局函数相同。

这两个修饰的方法通过实例和类调用都是可以的

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)

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,在单例模式中能用到

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>

  

  

Python的@符号

标签:blog   ar   sp   div   on   log   ef   bs   as   

原文地址:http://www.cnblogs.com/baibai-tech/p/4035488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!