• python学习之路---day19--面向对象--约束


                                    约束和异常
    一:约束:
      约束方法:(解释:就相当于在想项目中,先提前规划好框架和约定基本代码,像定义好调用的名字后,后面的名字只能用这个,用其他的
      名字就会抛出异常。错误)

    1:提取父类,然后再父类中定义好方法,在这个方法什么不用干,就抛出
    一个异常,这样所有的子类必须重写这个方法,否则就会报错
    2:使用原类来描述父类,在元类中给出一个抽象方法 这样子类就不得不给出抽象方法的具体、
    方法的具体实现,可以起到约束的效果

     

      001):从实例理解
    第一种约束方法:
    提取父类,然后在父类中定义好方法,在这个方法什么不用干,就抛出一个异常,
    这样所有的子类必须重写这个方法,否则就会报错

    基本思想:相当于就是 一个 基本的程序,分为多个模块,然后分配给不同的人去做,但是每个人的代码习惯和取名习惯不一样
    ,在后面的总的模块合在一起,需要调用相同的功能时,名字不一样,从而造成有的模块没有调用到而产生异常

      01)实例01:

     

    class Base: #这个是用来约束后面不同成员的函数,强制子类不能乱起函数名字,必须是用login ,不然会报错
    
    def login(self):
    raise NotImplementedError ("子类没有实现继承")
    
    class Normal(Base): #
    def login(self):
    print("游客")
    
    class Member(Base):
    def login(self): 这里这里将login(self)登陆名字写成 denglu(self) 后面的程序是执行不了的
    print("吧务的登陆")
    class Admin(Base):
    def login(self):
    print("管理员")
    
    def login(obj):
    print("准备")
    obj.login()
    print("主页进入 ")
    
    n=Normal() #实例化对象
    m=Member()
    a=Admin()
    login(n) #调用功能。这里如果的有的登陆名字写成 denglu(n) 后面的程序是执行不了的
    login(m)
    login(a)

     

      002):第二约束方法:
    2:使用原类来描述父类,在元类中给出一个抽象方法 这样子类就不得不给出抽象方法的具体、
    方法的具体实现,可以起到约束的效果
    基本思想: 写出抽象类和抽象方法,来约束后面的子类

    实例02:

    from abc import ABCMeta ,abstractmethod
    
    class Base(metaclass=ABCMeta): #抽象类
    #抽象类
    @abstractmethod #
    def login(self): #强制子类做xxx事
    pass
    def haha(self): #这个是抽象类里面的正常的方法,是可以有的,,怎么调用它呢????????
    print("hahawowo o")
    
    class Normal(Base):
    pass
    def login(self): #重写了父类的抽象方法
    print("普通账号的登陆")
    n=Normal()
    
    原因时Base是一个抽象类,含有抽象方法,不允许创建实例对象
    b=Base() #报错:TypeError: Can't instantiate abstract class Base with abstract methods login
    b.haha() #报错:TypeError: Can't instantiate abstract class Base with abstract methods login
    一个类如果全部都是抽象方法,这个类可以被接口,用来约束子类和规范子类
    
    from abc import ABCMeta,abstractmethod #写抽象类需要引入抽象模块
    class Animal(metaclass=ABCMeta):
    @abstractmethod
    def chi(self): #抽象概念
    pass
    class Cat(Animal):
    def chi(self): #子类对抽象的内容给出具体的实现,重写
    print("猫用嘴吃")
    c=Cat()
    c.chi()
    
    a=Animal()
    a.chi() #TypeError: Can't instantiate abstract class Animal with abstract methods chi

    二:异常处理

    001):异常:程序在运行时出现了错误
    002):先认识异常:
    def chu(a,b):
    return a/b
    ret=chu(3,0)
    print(ret)
    报错: ZeroDivisionError: division by zero
    #我们知道除数是不能为0的,
    
    解决异常:
    try: .... except 运行xx代码,出现了错误就执行except 后面的代码
    def chu(a,b):
    return a/b
    try:
    ret=chu(3,0)
    print(ret)
    except Exception as e:
    print("除数不能为0")
    打印结果:除数不能为0
    
    由python解释器来调用代码. 出现了错误. 系统会自动的产生一个叫异常的对象.
    系统会尝试着把错误返回给调用方. 过程被称为:抛异常
    我们通过try...except 可以吧系统产生的这个错误获取到. 过程叫捕获异常

      异常处理实例:

    import traceback
    #计算a+b
    def cul(a,b):
    if (type(a) == int or type(a)==float) and (type(b)==int or type(b)==float):
    return a+b
    else:
    # 在这里有两种方案. 1. 直接返回 , 2. 抛出异常
    # # raise 抛出 Exception 错误和异常,所有错误的根
    raise Exception("要的是整型和float型 ")

    #捕获异常:

    try:
    print(cul(1,"是的")) #我们给其错误的信息看看
    except Exception as e:
    #获取到错误信息,我们需要访问堆栈信息
    print(traceback.format_exc()) #获取堆栈信息
    print("出现了错误")
    
    
    有些错误是python 内部没有给我们里出来的,我们就需要自定义异常,但是
    自定义异常会出现问题就是 pyhton 不会给出具体的记录,所以自定义异常的
    异常名字要符合规范,要慎用
    自定义异常实例:
    class GenderException(Exception): #自定义性别异常
    pass
    class Person:
    def __init__(self,name,gender):
    self.name=name
    self.gender=gender
    
    def goto_nan_yushi(self):
    if self.gender !="":
    raise GenderException("性别不对") #raise 这里就是给程序员看的,给其说明是哪里错误
    else:
    print("welcome")
    
    #处理捕获异常
    try:
    p1=Person("张三","")
    p1.goto_nan_yushi()
    
    p2=Person("李四","nv")
    p2.goto_nan_yushi()
    
    except GenderException as e:
    print("进错了") #这里错误是给客户看的
    
    except Exception as e:
    print("其他原因你不能进去") #这里错误是给客户看的

    四:日志处理:

    import logging
    filename: ⽂件名
    format: 数据的格式化输出. 最终在⽇志⽂件中的样⼦
    时间-名称-级别-模块: 错误信息
    datefmt: 时间的格式
    level: 错误的级别权重, 当错误的级别权重⼤于等于leval的时候才会写⼊⽂件
    logging.basicConfig(filename='x1.log',
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    level=30)
    当前配置表示 0以上的分数会被写⼊⽂件
    CRITICAL = 50
    FATAL = CRITICAL
    ERROR = 40
    WARNING = 30
    WARN = WARNING
    INFO = 20
    DEBUG = 10
    NOTSET = 0
    logging.critical("我是critical") # 50分. 最贵的
    logging.error("我是error") # 40分
    logging.warning("我是warning")
    logging.info("我是info")
    logging.debug("我是debug")
    logging.log(1, "我什么都不是")
    
    import traceback
    try:
    print(1/0)
    except Exception:
    logging.error(traceback.format_exc()) # 用法
    print("出错了")
    
    
    import logging
    # 创建⼀个操作⽇志的对象logger(依赖FileHandler)
    # open()
    file_handler = logging.FileHandler('zuo.log', 'a', encoding='utf-8')
    file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
    logger1 = logging.Logger('qq', level=20)
    logger1.addHandler(file_handler) # 把文件助手和日志对象绑定
    logger1.error('我是A系统出错了') # 记录日志
    
    
    # 再创建⼀个操作⽇志的对象logger(依赖FileHandler)
    file_handler2 = logging.FileHandler('you.log', 'a', encoding='utf-8')
    file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
    logger2 = logging.Logger('B系统', level=20)
    logger2.addHandler(file_handler2)
    
    import traceback
    try:
    print(1/0)
    except Exception:
    logger2.critical(traceback.format_exc())
    print("出错了. 请联系管理员")
    print("程序继续执行")
    
    
    from types import MethodType, FunctionType
    class Foo:
    @classmethod
    def func1(self):
    pass
    @staticmethod
    def func2(self):
    pass
    def func3(self):
    pass
    
    def func4(self):
    pass
    
    # obj = Foo()
    # lst.append(obj.func4)
    # for item in lst:
    # print(isinstance(item, MethodType))

     

  • 相关阅读:
    sqlite遇到database is locked问题的完美解决
    Delphi使程序的窗口出现在最前面并激活
    win10 家庭版不支持gpedit.msc的解决办法
    Delphi Record To Stream
    SQL Server 查看CPU情况
    JavaScript 获取 Url 上的参数(QueryString)值
    关于EF分页查询报错(Count must have a non-negative value.)的解决方案
    调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
    Javascript中“==”与“===”的区别
    IE浏览器各版本的CSS Hack
  • 原文地址:https://www.cnblogs.com/one-tom/p/9948077.html
Copyright © 2020-2023  润新知