python裝飾器相當于函數(shù)的調用方式
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ù)當做參數(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ù)當做參數(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ū)別,只不過在裝飾器內部返回的函數(shù)中,第一個參數(shù)是固定的,是調用方法的對象本身,如
果是實例對象,就是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。可以在args前面定義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裝飾器相當于函數(shù)的調用方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python模擬預測一下新型冠狀病毒肺炎的數(shù)據(jù)
這篇文章主要介紹了python模擬預測一下新型冠狀病毒肺炎的數(shù)據(jù) ,需要的朋友可以參考下2020-02-02
淺談python中np.array的shape( ,)與( ,1)的區(qū)別
今天小編就為大家分享一篇python中np.array的shape ( ,)與( ,1)的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
一文帶你了解Python中的type,isinstance和issubclass
這篇文章主要為大家詳細介紹了Python中的type、isinstance和issubclass的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-01-01
基于django 的orm中非主鍵自增的實現(xiàn)方式
這篇文章主要介紹了基于django 的orm中非主鍵自增的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python提示[Errno 32]Broken pipe導致線程crash錯誤解決方法
這篇文章主要介紹了Python提示[Errno 32]Broken pipe導致線程crash錯誤解決方法,是ThreadingHTTPServer實現(xiàn)http服務中經常會遇到的問題,需要的朋友可以參考下2014-11-11

