设为首页 加入收藏

TOP

Python的@符号
2015-04-07 15:29:15 来源: 作者: 【 】 浏览:45
Tags:Python 符号

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


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


?


?


?



1


2


3


4


5


6


7


8


9


10


11


12


13


14


15



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面向对象编程 下一篇HTML5-炫丽的时钟效果Canvas绘图..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: