python 장식기의 사용 예시

2846 단어 python장식기예제
수식 없음, 매개 변수가 없을 때 호출할 필요가 없음

def log1(func):
  func()
@log1
def test():
  print('test:')
수식이 있다

def log2(func):
  def inner(*args, **kwargs):
    func(*args, **kwargs)
  return inner
@log2
def test(num):
  print('testlog2:',num,test.__name__)
test(20) # log(test(20))
@wraps는 장식기 장식 함수의name 값이 변하지 않도록 보장합니다
파라미터가 없는 장식기

def log3(func):
  @wraps(func)
  def inner(*args, **kwargs,):
    func(*args, **kwargs)
  return inner
@log3
def test(num):
  print('testlog3:',num,test.__name__)
test(30) # log(test(30))
파라미터가 있는 장식기

def log4(level):
  def log(func):
    @wraps(func)
    def inner(*args, **kwargs,):
      if level == "warn":
        print("%s is running" % func.__name__)
      func(*args, **kwargs)
    return inner
  return log
@log4(level="warn")
def test(num):
  print('testlog4:', num, test.__name__)
test(40)
파라미터와 파라미터가 없는 장식기 자체 적응을 실현하다

def log(arg):
  if callable(arg): #  , 
    def log3(func):
      @wraps(func)
      def inner(*args, **kwargs, ):
        func(*args, **kwargs)
      return inner
    return log3
  else:
    def log4(func):
      @wraps(func)
      def inner(*args, **kwargs,):
        if arg == "warn":
          print("%s is running" % func.__name__)
        func(*args, **kwargs)
      return inner
    return log4
@log(arg=None)
def test(num):
  print('testlog:', num, test.__name__)
test(0)
입참출삼

def log5(func):
  def inner(*args, **kwargs):
    print(' :',func.__name__, args, kwargs)
    res =func(*args, **kwargs)
    print(' :',func.__name__, res)
    return res
  return inner
@log5
def test(num):
  print('testlog5:', num, test.__name__)
  return num
print(test(50))
클래스 장식기

class Loging:
  def __init__(self,level):
    self.level = level

  def __call__(self,func):
    @wraps(func)
    def inner(*args, **kwargs):
      if self.level == "warn":
        self.notify(func)
      func(*args, **kwargs)
    return inner

  def notify(self,func):
    print ("%s is running" % func.__name__)


@Loging(level="warn")
def test(num):
  print('testLoging:', num, test.__name__)
test(0)
이상은python 장식기의 사용 예시에 대한 상세한 내용입니다. 더 많은python 장식기에 대한 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기