什么是python的裝飾器?
網絡上的定義:
裝飾器就是一函數,用來包裝函數的函數,用來修飾原函數,將其重新賦值給原來的標識符,并永久的喪失原函數的引用。
最能說明裝飾器的例子如下:
代碼如下:
#-*- coding: UTF-8 -*-
import time
def foo():
print 'in foo()'
# 定義一個計時器,傳入一個,并返回另一個附加了計時功能的方法
def timeit(func):
# 定義一個內嵌的包裝函數,給傳入的函數加上計時功能的包裝
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
# 將包裝后的函數返回
return wrapper
foo = timeit(foo)
foo()
python中提供了一個@符號的語法糖,用來簡化上面的代碼,他們的作用一樣
代碼如下:
import time
def timeit(func):
def wrapper():
start = time.clock()
func()
end =time.clock()
print 'used:', end - start
return wrapper
@timeit
def foo():
print 'in foo()'
foo()
這2段的代碼是一樣的,等價的。
內置的3個裝飾器,他們分別是staticmethod,classmethod,property,他們的作用是分別把類中定義的方法變成靜態方法,類方法和屬性,如下:
代碼如下:
class Rabbit(object):
def __init__(self, name):
self._name = name
@staticmethod
def newRabbit(name):
return Rabbit(name)
@classmethod
def newRabbit2(cls):
return Rabbit('')
@property
def name(self):
return self._name
裝飾器的嵌套:
就一個規律:嵌套的順序和代碼的順序是相反的。
也是來看一個例子:
代碼如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makebold
@makeitalic
def hello():
新聞熱點
疑難解答