1. 程式人生 > 程式設計 >python裝飾器相當於函式的呼叫方式

python裝飾器相當於函式的呼叫方式

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 需要引數:

foo = use_loggine(foo) 第一個引數就是func這個函式物件,不包含引數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. 裝飾器帶引數

 foo = use_logging('warn')(foo) 還是把被裝飾的函式當做引數賦給裝飾器

 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. 類裝飾器,還是把被裝飾的函式當做引數賦給裝飾器

 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. 類方法裝飾器

類方法裝飾器和其他裝飾器沒有什麼區別,只不過在裝飾器內部返回的函式中,第一個引數是固定的,是呼叫方法的物件本身,如

果是例項物件,就是self,是類方法的話,就是cls,靜態方法的話,沒有第一個引數。

 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裝飾器相當於函式的呼叫方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。