Python项目-Day16-装饰器-设计模式

Python项目-Day16-装饰器-设计模式

  1. 装饰器(只能给函数使用)

    解释:拓展原来函数的一种函数

    目的:在不修改原函数的代码前提下添加新的功能

    • 装饰器的使用

      举例:

      def debug(func):
          def wrapper():
              print("执行了装饰器里的方法")
              func()#这个func叫回调函数
          return wrapper
      @debug
      def show():
          print("执行了show方法")
      show()
      
      执行步骤: show()->看到show方法上面的debug->执行debug方法,
      ->返回wrapper去执行->执行print->执行func()->func就是show方法->执行结束
      
    • 装饰器的传参和返回值

      def log(func):
          from datetime import datetime
          def wrapper(m,*args):
              print("当前执行的代码是:",func.__name__)
              print("添加用户是:",m)
              dd=datetime.now().strftime('%Y-%m-%d %H-%M-%S')
              print("执行时间是:",dd)
              return func(m)
          return wrapper
      
      @log
      def addUser(user):
          if user:
              # 添加用户省略
              return True
          else:
              return False
      res=addUser(' ')
      
      res and print("添加用户成功")
      

      注意:在addUser()里面加上形参,在wrapper上也要加上形参

    • 多个装饰器

      def A(func):
          def wrapper(*args):
              print('a begin.........')
              func()
              print('a end ........')
          return wrapper
      
      
      def B(func):
          def wrapper(*args):
              print('b begin.........')
              func()
              print('b end ........')
          return wrapper
      
      
      def C(func):
          def wrapper(*args):
              print('c begin.........')
              func()
              print('c end ........')
          return wrapper
      @A
      @B
      @C
      def show():
          print("show is running")
      
      
      show()
      
      执行结果:
      a begin.........
      b begin.........
      c begin.........
      show is running
      c end ........
      b end ........
      a end ........
      
    • python3装饰器

      导入包:

      from functools import wraps

      使用wraps会使代码运行的更快

      from functools import wraps
      def log(func):
          from datetime import datetime
          wraps(func)
          def wrapper(m,*args):
              print("当前执行的代码是:",func.__name__)
              print("添加用户是:",m)
              dd=datetime.now().strftime('%Y-%m-%d %H-%M-%S')
              print("执行时间是:",dd)
              return func(m)
          return wrapper
      
      @log
      def addUser(user):
          if user:
              # 添加用户省略
              return True
          else:
              return False
      res=addUser(' ')
      
      res and print("添加用户成功")
      
    • 装饰器传值

      from functools import wraps
      def log(*log_args):
          def decorated(func):
              from datetime import datetime
              @wraps(func)
              def wrapper(m,*args):
                  print("当前执行的代码是:",log_args[0],func.__name__)
                  print("添加用户是:", m)
                  dd = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
                  print("执行时间是:", dd)
                  return func(m)
              return wrapper
          return decorated
      
      @log("a")
      def addUser(user):
          if user:
              # 添加用户省略
              return True
          else:
              return False
      res=addUser(' ')
      
      res and print("添加用户成功")
      
  2. 设计模式

    __new__用来声明对象

    __init__用来初始化对象

    单例模式的实现:

    声明一个为None的类变量__instance

    如果创建过对象,这个类变量__instance就会被改变

    以后再创建对象,只会返回第一次创建的对象,也就是__instance

    class Person(object):
        __instance=None
        def __new__(cls, *args, **kwargs):
            print("我在生产对象")
            if not cls.__instance:
                cls.__instance=object.__new__(cls)
            return cls.__instance
        def __init__(self,id,name):
            super(Person,self).__init__()
            self.id = id
            self.name = name
    
        p1=Person('001','python')
        p2 = Person('002','python')
        p3 = Person('003','python')
    
        print(p1.id)
        print(p2.id)
        print(p3.id)
    
    
        p3和p4本质上都是p1,只不过属性都是p3(最后一次创建的对象的属性)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值