zoukankan      html  css  js  c++  java
  • 两个小例子彻底明白python decorator

    一:没有什么实际意思,就是单纯的理解decorator。使用装饰器完全可以阻止方法中的代码执行。

    class json_test(object):
      def __init__(self, *arg, **args):
        self.name = 'default_name'
        self.gender = 'default_gender'
        self.age = 0
        self.address = None
    jt = json_test()
    
    class ignore_null_value(object):
      def __init__(self, *args, **kwargs):
        print('ignore_null_value.init')
        
      @staticmethod
      def to_json(*arg, **args):
        d = {}
        for key, value in arg[0].__dict__.items():
          if value != None:
            d.setdefault(key, value)
        for key, value in args:
          d.setdefault(key, value)
        return d
        
        
    class keep_null_value(object):
      def __init__(self, *args, **kwargs):
        print('keep_null_value.init')
        
      @staticmethod
      def to_json(o):
        return o.__dict__
    
    def deco(c):
      def _deco(func):
        def __deco(*arg, **args):
          print('before')
          try:
            s = c.to_json(*arg, **args)
            return s 
          finally:
            print('after')
        return __deco
      return _deco
    
    class c(object):
      @staticmethod
      @deco(keep_null_value)
      def json_from(self, a):
        pass
    
    cl = c()
    print cl.json_from(jt)

    二:输出前后加上log,这个是书中的原例子,哪本书不记得了,不是《python基础教程》就是《python核心编程》

    from time import time
    
    def logged(when):
      def log(f, *args, **kargs):
          print '''Called:
      function: %s
      args: %r
      kargs: %r''' % (f, args, kargs)
    
      def pre_logged(f):
        def wrapper(*args, **kargs):
          log(f, *args, **kargs)
          return f(*args, **kargs)
        return wrapper
    
      def post_logged(f):
        def wrapper(*args, **kargs):
          now = time()
          try:
            log(f, *args, **kargs)
            return f(*args, **kargs)
          finally:
            print "time delta: %s" % (time() - now)
        return wrapper
      try:
        return {"pre": pre_logged, "post": post_logged}[when]
      except KeyError, e:
        raise ValueError(e), 'must be "pre" or "post"'
                        
    @logged("post")
    def hello(name):
        print "Hello,", name
        
    hello("World!")
  • 相关阅读:
    Cookie
    servletContext组件
    Servlet的定义及生命周期
    导引:servlet&Jsp的经典模式
    一个servlet server,由移植自Tomcat的连接器模块和自编写的container模块代码组成
    一个servlet web server,由移植自Tomcat的完整的connector模块和简化的Container(取代servlet处理器)组成
    python初识
    Maekdown光速习得
    实例学习——爬取简书网用户动态
    使用CSDN-markdown编辑器粘贴代码块时崩溃问题解决
  • 原文地址:https://www.cnblogs.com/badboyf/p/6527525.html
Copyright © 2011-2022 走看看