zoukankan      html  css  js  c++  java
  • 21、多态与多态性、内置方法、反射、异常处理

    一、多态与多态性

    面向对象的三大特点:封装、继承、多态
    
    1、什么是多态?
    	多态指的是同一种事物有多种形态
    2、为何要有多态==》多态会带来什么样的特性,多态性
    	多态性指的是可以在不考虑对象具体类型的情况下,而直接使用对象	
    
    class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod  # 强制统一标准的功能
        def say(self):  # 统一所有子类的方法
            print('怎么叫的..', end='')
    
    
    # 方便使用者,只要考虑父类有什么,子类一定有,要用新的话就覆盖
    # python推崇的是一种鸭子类型
    class People(Animal):
        def say(self):
            print('aaaaaa')  # 派生,子类覆盖
    
    
    class Dog(Animal):
        def say(self):
            super().say()
            print('www')
    
    
    class Pig(Animal):
        def say(self):
            super().say()
            print('hhh')
    
    
    
    
    obj1 = People()
    obj2 = Dog()
    obj3 = Pig()
    
    
    obj1.say()
    obj2.say()
    obj3.say()
    
    
    定义统一的接口,接收传入的动物对象
    def annimal_say(annimal):
        annimal.say()
    
    
    annimal_say(obj1)
    annimal_say(obj2)
    annimal_say(obj3)
    
    python推崇的是鸭子类型
    

    二、内置方法

    __开头并且是__结尾的属性会在满足某种条件下自动触发
    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.f = open('a.json', mode='rt', encoding='utf-8')
    
        def __str__(self):  # 打印对象的时候自动触发
            return '<%s:%s>' % (self.name, self.age)
            # 返回值必须是字符串
    
        def __del__(self):
            self.f.close()
            # 关闭掉打开的文件,回收内存空间
    
    
    obj = People('egon', 19)
    print(obj)
    

    三、反射

    class People:
        country = 'china'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def tell_info(self):
            print(self.name, self.age)
    
    
    obj = People('egon', 18)
    
    print(hasattr(obj, 'country'))  # 查看obj是否具有country这个属性
    # True
    
    res = getattr(obj, 'country')
    # 类似于字典的取值,提取这个属性值,没有就报错
    print(res)
    # china
    
    
    method = getattr(obj, 'tell_info')
    # 可以提取函数,加括号直接调用
    method()
    # 调用tell_info这个函数
    
    setattr(obj, '顾鑫鑫', '吃屎')
    # 更新属性,给obj增加一条key于value
    print(obj.__dict__)
    # {'name': 'egon', 'age': 18, '顾鑫鑫': '吃屎'}
    
    delattr(obj, '顾鑫鑫')
    print(obj.__dict__)
    # {'name': 'egon', 'age': 18}
    

    四、异常处理

    1、什么是异常?
    异常是错误发生的信号
    程序一旦出错,就会产生一个异常
    如果该异常没有被处理,该异常就会抛出来,程序的运行也随即终止

    错误分为两种:
        1、语法错误
        2、逻辑错误
    

    2、为何要处理异常

    3、如何处理
    语法错误>程序运行前必须改正确
    逻辑错误
    >尽可能的避免逻辑错误
    针对可以控制的逻辑错误,应该直接在代码层面就解决了
    针对不可以控制的逻辑错误,应该采用try...except...
    能不用就尽量不要用

    4、try...except...是一种异常产生之后的补救措施

    try:
    被监测的代码块
    excep 异常的类型1 as e:
    处理异常的代码(不会被抛出来)
    excep 异常的类型2 as e:
    处理异常的代码(不会被抛出来)
    excep 异常的类型3 as e:
    处理异常的代码(不会被抛出来)

    except Exception:#万能异常
    处理异常的代码

    else:
    没有发生异常时,要执行的代码。
    finally:
    无论有没有异常,都会执行这串代码,通常是用来执行回收资源的操作

    #断言
    l = [111,222]
    if len(l) != 3:
        raise Exception('必须达到三个值')
    assert len(l)  == 3
    print('后续代码。。。')
    
    ===============输出结果==============
    Exception: 必须达到三个值
    
    #raise 主动抛出错误
    raise IndexError("索引错误")
    
    #自定义异常
    class Permission(BaseException):
        def __init__(self,msg):
            self.msg = msg
    
    raise Permission("权限错误")
    
  • 相关阅读:
    判断是否是唯一索引异常
    Sign in with Apple java
    spring 集成钉钉机器人
    list一个字段去重
    Math_Linear_algebra_05_正定矩阵
    Math_Linear_algebra_02_矩阵与线性方程
    Math_Calculus_04_多变量微积分
    Math_Linear_algebra_01_向量空间
    Linux_Best Practice_04_Ubuntu 18.04
    PMP_Previw
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/14271874.html
Copyright © 2011-2022 走看看