Python部分【七】

设计模式

  • 单例设计模式
    • 类创建的对象在系统中永远只有唯一的一个实例
  • __new__方法
    • 使用类名()创建对象时,python的解释器首先会调用__new__方法为对象分配空间
    • __new__是一个由object基类提供的内置的静态方法—作用如下
      • 在内存中为对象分配空间
      • 返回对象的引用
  • 为了实现单例因此必须要重构__new__
    • 重写new方法一定要使用return super().new(cls)
    • 否则python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
    • __new__是一个静态方法,在调用时需要主动传递cls参数,不可以直接使用类名.的方式对类属性进行调用
    • 定义
      def __new__(cls, *args, **kwargs):
          print("creat object")
          return super().__new__(cls) # 父类方法的返回结果就是当前内存地址
      
    • 如何实现单例设计
      • 单例本质就是创建一个以该类为基类的对象
      • 因此对于new来讲如果前期已经创建过对象,则当前不再进行创建,而是直接返回以前的对象
      • 引入类属性instance = None来进行判断 如下
      class Player(object):
          instance = None # 记录第一个被创建对象的引用
          def __new__(cls, *args, **kwargs):
              if instance is None:
                  cls.instance = super().__new__(cls) # 父类方法的返回结果就是当前内存地址
              return cls.instance
      
      • 在每次使用类名()进行创建对象时,会进行如下两个操作
        • __new__进行空间分配
        • __init__进行对象初始化
      • 按照上述修改代码不难发现,初始化不止一次会被调用—如何才能只调用一个初始化呢
        • 定义一个类属性—init_flag判断是否有进行过初始化—初始值为false
        • 在__init__中先进行判断再决定是否需要执行初始化操作
      init_flag = False
      def __init__(self):
          if init_flag == False:
              print("初始化操作")
              Player.init_flag = True
      

异常

  • 程序停止执行并且提示错误信息,称为抛出异常
  • 异常是抛给编写程序的流程而非用户
  • 捕获异常
    • 测试代码的过程中需要这种语法进行代码测试
    • 定义
    try:
      try_coding
    except:
      #出现错误的处理
    
    • 需要注意的是—在except执行后,后续代码会依然执行
  • 错误类型捕获
    • 捕获已知错误
      try:
          try_coding
      except 类型一:
          #出现错误的处理
      except (类型二, 类型三):
          #出现错误的处理
      
      • 如何获得类型—最后一行报错的第一个单词就是错误类型
    • 捕获未知错误
      except Exception as result:
          print("未知错误 %s" % result)
      
  • 完整异常捕获的完整语法
    try:
        #测试代码
    except 类型一:
        #类型一执行代码
    except (类型二, 类型三):
        #类型二和类型三执行代码
    except Exception as result:
        print("未知错误类型 %s" % result)
    else:
        # 测试代码未抛出异常时继续执行的代码
    finally:
        # 不论是否抛出异常都要执行的代码
    
  • 异常的传递
    • 当函数和方法执行出现异常,会将异常传递给函数和方法的调用一方
    • 如果传递到主程序,依然没有异常处理,程序才会被终止
    • 因此,在主函数中增加异常捕获即可,没有必要对每个方法都写入异常
  • 主动抛出异常—特有的业务需求
    • 例如—用户界面输入密码错误需要抛出异常提醒用户
    • Exception是一个类可以创建异常对象,而后用raise抛出即可
      • 例子—提醒用户输入密码—如果密码长度错误则抛出异常
      def input_password():
          pwd = input("输入密码:")
          if len(pwd) >= 8:
              return pwd
          ex = Exception("密码长度不够") # 参数就是异常原因
          raise ex # 抛出异常对象
      try:
          input_password()
      except Exception as result:
          print(result) # 此时直接用result输出就是创建对象输入的参数---密码长度不够
      

你可能感兴趣的:(python,开发语言)