首页 > 代码库 > python装饰器与面向切面编程
python装饰器与面向切面编程
1.装饰器
1 #!/usr/bin/env python 2 #encoding=utf-8 3 4 import time 5 6 def foo(): 7 print ‘in foo()‘ 8 9 # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法10 def timeit(func):11 # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装12 def wrapper():13 start = time.clock()14 func()15 end =time.clock()16 print ‘used:‘, end - start17 18 # 将包装后的函数返回19 return wrapper20
21 print ‘1‘ 22 foo = timeit(foo)
23 print 224 foo()25
打印结果:
1
2
used: 0.0
一个简易的计时器就做好了!我们只需要在定义foo以后调用foo之前,加上foo = timeit(foo),就可以达到计时的目的,这也就是装饰器的概念>,看起来像是foo被timeit装饰了。在在这个例子中,函数进入和退出时需要计时,这被称为一个横切面(Aspect),这种编程方式被称为面向切面>的编程(Aspect-Oriented Programming)
语法糖:
1 import time 2 3 def timeit(func): 4 def wrapper(): 5 start = time.clock() 6 func() 7 end =time.clock() 8 print ‘used:‘, end - start 9 return wrapper10 11 @timeit12 def foo():13 print ‘in foo()‘14 15 foo()16 重点关注第11行的@timeit,在定义上加上这一行与另外写foo = timeit(foo)完全等价,千万不要以为@有另外的魔力。除了字符输入少了一些,还有一个额外的好处:这样看上去更有装饰器的感觉
内置的装饰器
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多,除非你想要完全的面向对象编程。而属性也不是不可或缺的,Java没有属性也一样活得很滋润。从我个人的Python经验来看,我没有使用过property,使用staticmethod和classmethod的频率也非常低。
1 class Rabbit(object): 2 3 def __init__(self, name): 4 self._name = name 5 6 @staticmethod 7 def newRabbit(name): 8 return Rabbit(name) 9 10 @classmethod11 def newRabbit2(cls):12 return Rabbit(‘‘)13 14 @property15 def name(self):16 return self._name
这里定义的属性是一个这里定义的属性是一个只读属性,如果需要可写,则需要再定义一个setter:
1 @name.setter2 def name(self, name):3 self._name = name
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。