一、异常捕获
1.什么是异常 - 程序在执行过程因为遇到错误的语法导致程序奔溃
2.什么是异常捕获 - 通过异常捕获的程序让本身会异常的代码能够继续执行
3.怎么捕获异常
1)语法一 - 捕获代码段1中所有的异常
try:
代码段1
except:
代码段2
finally:
代码段3
其他语句
说明:
try、except - 关键字,固定写法
代码段1 - 需要捕获异常的代码段
代码段2 - 捕获到异常后会执行的代码
执行过程:先执行代码段1,如果执行过程中出现了异常,程序不崩溃,直接执行代码段2,然后接着执行后续其他语句
try:
age = int(input('请输入年龄(0~150):'))
print('年龄:', age)
except:
print('年龄输入有误!')
try:
age = int(input('请输入年龄:'))
print(age)
list1 = [10, 20, 30]
print(list1[10])
except:
print('年龄输入有误!')
2)语法二 - 捕获代码段1中的指定异常
try:
代码段1
except 异常类型:
代码段2
finally:
代码段3
说明:
异常类型 - 类,必须是Exception类的子类(系统提供的错误类型: KeyError,IndexError,TypeError、自定义错误类型)
执行过程: 先执行代码段1,执行过程中如果出现异常就判断出现的异常类型和except后面的异常类型是否相等,如果相等程序不报错,直接执行代码段,否则程序直接崩溃。
try:
print([1, 2, 3][10])
print('=============')
print({}['age'])
print('+++++++++++++')
except IndexError:
print('出现异常!')
3)方法三 - 同时捕获代码段1的多种异常,对不同的异常的处理相同
try:
代码段1
except (异常类型1,异常类型2,…):
代码段2
finally:
代码段3
4)方法四 - 同时捕获代码段1中的多种异常,针对不同的异常做不同的处理
try:
代码段1
except 异常类型1:
代码段11
except 异常类型2:
代码段22
…
finally:
代码段3
4.finally
上面的4种捕获异常的结构的最后都可以添加一个finally语句:
try:
代码段1
except:
代码段2
finally:
代码段3
不断需要捕获异常的代码段1出现了什么情况,finally后面的代码段3都会执行
try:
print('abc')
print({}['age'])
print([1, 2, 3][10])
except IndexError:
print('出现异常')
finally:
print('写遗书')
二、继承
- 什么是继承
继承就是让子类直接拥有父类的属性和方法
子类 - 继承者
父类 - 被继承者
python中所有的类都是直接或者间接继承自object类(object是python的基类)
2.继承的语法
class 类名(父类):
类的内容
定义类的时候如果没有写父类,父类就是object
class Person:
num = 100
def __init__(self):
self.name = '张三'
self.age = 1
self.gender = '男'
def eat(self, food):
print(self.name+'在吃'+food)
@classmethod
def destruction(cls):
print('人类破坏环境')
# 让Student(子类)继承Person(父类)
class Student(Person):
pass
stu1 = Student()
print(stu1.name, stu1.age, stu1.gender)
stu1.eat('火锅')
print(Student.num)
Student.destruction()
三、给子类添加属性和方法
1.添加属性和方法
1)添加方法和类属性 - 直接在子类中添加
2) 添加对象属性
子类是通过继承父类的__init__方法来继承父类的对象属性,
如果要在子类中添加对象属性,需要在子类的__init__方法中通过super()去调用父类的__init__方法。
注意:在子类中可以通过super()去调用父类的任意方法
“”"
#2.类中方法的调用过程
“”"
通过类或者对象调用方法的时候,先看当前类中有没有这个方法,如果有直接调用;没有就看父类中有没有这个方法,
如果有调用父类的方法;如果没有就看父类的父类有没有,…以此类推,如果找到object都没有这个方法才报错
class Person:
# 类属性
num = 100
# 对象属性
def __init__(self):
self.name = '张三'
self.age = 18
self.gender = '男'
# 方法
def eat(self, food):
print(f'{self.name}在吃{food}')
def func1(self):
print('人类中的func1')
class Student(Person):
# 添加类属性
flag = '认真学习'
# 添加方法
@staticmethod
def study():
print('好好学习,天天向上!')
# 重写func1
def func1(self):
print('学生类中的func1')
def func2(self):
print('学生类中的func2')
# 添加对象属性
def __init__(self):
# 调用当前类的父类的__init__方法
super().__init__()
self.study_id = '001'
stu1 = Student()
p1 = Person()
print(Student.num, Student.flag)
Student.study()
# stu1.eat('火锅')
stu1.func1()
p1.func1()
print(stu1.name, stu1.age, stu1.gender, stu1.study_id)
# 练习:
class Animal:
def __init__(self, color, age=1, gender='雄性'):
self.age = age
self.gender = gender
self.color = color
def eat(self):
print('动物要吃东西')
# 定义Dog类继承Animal,并且添加属性:名字和类型,创建对象的时候名字、类型和颜色必须赋值,age和gender可以赋值也可以不用赋值
class Dog(Animal):
def __init__(self, name, type, color, age=1, gender='公'):
super().__init__(color, age, gender)
self.name = name
self.type = type
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
dog1 = Dog('大黄', '土狗', '黄色', gender='母')
print(dog1)
# 练习:
class Person:
def __init__(self, name, age=19, gender='男'):
self.name = name
self.age = age
self.gender = gender
# 定义一个教师类,除了Person以外还拥有:职工编号,职称和工龄、以及学科。要求创建教师类的时候姓名、编号、年龄必须赋值,职称、工龄和性别可以赋值也可以不赋,性别、学科不能赋值
class Teacher(Person):
def __init__(self, name, tea_id, age, title='副教授', job_age=2):
super().__init__(name, age)
self.tea_id = tea_id
self.title = title
self.job_age = job_age
self.subject = 'Python'
t1 = Teacher('余婷', '001', 18)
print(t1.__dict__)
四、自定义异常类型和抛出异常
1.抛出异常 - 主动让程序崩溃
语法
raise 异常类型
说明
raise - 关键字,固定写法
异常类型 - 类, 必须是Exception的子类
age = int(input('请输入年龄(0-150):'))
# if not 0 <= age <= 150:
# raise ValueError
2.自定义异常 - 定义一个类,继承Exception
class AgeError(Exception):
description = '年龄错误!'
# __str__的返回值必须是字符串,在异常类型中返回值就是抛出异常的时候的提示信息
def __str__(self):
return AgeError.description
if not 0 <= age <= 150:
AgeError.description = f'{age}是不合法的年龄值,合法年龄值是0~150'
raise AgeError
age = int(input('请输入改儿童的年龄(3~12):'))
if not 3 <= age <= 12:
AgeError.description = f'{age}不是正确的儿童年龄,儿童年龄范围是3~12'
raise AgeError