python裝飾器相當(dāng)于函數(shù)的調(diào)用方式
1. 普通裝飾器
import logging
1. foo = use_loggine(foo)
def use_loggine(func):
def wrapper():
logging.warn("%s is running " % func.__name__)
return func()
return wrapper
@use_loggine
def foo():
print "aaa"
foo()
print foo.__name__
2. func 需要參數(shù):
foo = use_loggine(foo) 第一個參數(shù)就是func這個函數(shù)對象,不包含參數(shù)foo(params)
def use_loggine(func):
def wrapper(name):
logging.warn("%s is running " % func.__name__)
return func(name)
return wrapper
@use_loggine
def foo(name):
print "name is %s" % name
3. 裝飾器帶參數(shù)
foo = use_logging('warn')(foo) 還是把被裝飾的函數(shù)當(dāng)做參數(shù)賦給裝飾器
def use_logging(level):
def decorator(func):
def wrapper(*args, **kwargs):
if level == 'warn':
logging.warn("%s is running" % func.__name__)
elif level == 'info':
logging.warn("%s is running" % func.__name__)
return func(*args)
return wrapper
return decorator
@use_logging('warn')
def foo(name):
print "i am %s" % name
foo = use_logging('warn')(foo)
print foo.__name__
foo('foo')
4. 類裝飾器,還是把被裝飾的函數(shù)當(dāng)做參數(shù)賦給裝飾器
foo = Foo(params)(func)
class Foo(object):
def __init__(self, name):
self.name = name
def __call__(self, func):
def aa():
print "class decorator running"
print "name is :%s" % self.name
func()
print 'class decorator ending'
return aa
@Foo("hello")
def bar():
print "world"
bar()
@deco
def foo()
pass
foo = deco(foo)
@deco(xx)
def foo():
pass
foo = deco(xx)(foo)
5. 類方法裝飾器
類方法裝飾器和其他裝飾器沒有什么區(qū)別,只不過在裝飾器內(nèi)部返回的函數(shù)中,第一個參數(shù)是固定的,是調(diào)用方法的對象本身,如
果是實例對象,就是self,是類方法的話,就是cls,靜態(tài)方法的話,沒有第一個參數(shù)。
from functools import wraps
def method_decor(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
u = func(*args, **kwargs)
return u
except Exception as e:
args[0].bb() # args[0]就是self或者cls??梢栽赼rgs前面定義self,更加方便u = func(self,*args, **kwargs)
return 'an Exception raised.'
return wrapper
class Foo(object):
@method_decor
def aa(self):
# print("This is wraped method")
raise Exception('aa')
def bb(self):
print("This is called method")
a = Foo()
a.aa()
以上這篇python裝飾器相當(dāng)于函數(shù)的調(diào)用方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python內(nèi)置函數(shù) next的具體使用方法
這篇文章主要介紹了Python內(nèi)置函數(shù) next的具體使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
python調(diào)用webservice接口的實現(xiàn)
這篇文章主要介紹了python調(diào)用webservice接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

