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("权限错误")
原文地址:https://www.cnblogs.com/zhaokunhao/p/14271874.html