1.异常
1.1 定义
正常情况下程序出现异常,程序会直接崩溃,不能接着往后执行。
异常捕获就是为了程序出现异常的时候不崩溃,自己处理异常
1.2 语法
- 语法1(获取所有异常):
try:
代码块1
except:
代码块2
其他语句
执行过程:先执行代码块1,执行过程中如遇到异常,程序不崩溃,直接执行代码块2
如果没有遇到异常,不执行代码块2.直接执行其他语句
- 语法2:
try:
代码块1
except 错误类型:
代码块2
其他语句
执行过程:先执行代码段1,如果在执行代码块1的过程中出现异常,检查出现的异常是否和except后面的错误类型一致
如果一致,程序不崩溃,直接执行代码块2;如果不一致,程序直接崩溃
如果没有异常,直接执行后面其他语句
- 语法3:
try:
代码段1
except(异常类型1, 异常类型2,....):
代码段2
4)语法4:
try:
代码块1
except 异常类型1:
代码块2
except 异常类型2:
代码块3
- 上面的四种结构的最后都可以加上一个finally;不管try里面的代码有没有异常,异常有没有被捕获
finally后面的代码都会执行。一般可以在这个地方做一些数据的保存和备份操作
try:
代码块1
except:
代码块2
finally:
代码块3
- try-except-else
try:
代码块1
except 错误类型:
代码块2
else:
代码块3
执行过程:先执行代码块1,如果遇到异常,则与except后面的错误类型比较,若一致,则执行代码块2;
若不一致,则崩溃。如果没有遇见异常,则执行else后面的语句
3.抛出异常
语法:
raise 异常类型
注意:异常类型可以是系统自带的,也可以是程序自定义的(要求异常类型必须是Exception的子类)
让程序主动崩溃
1.类和对象
1)类:类是拥有相同功能和相同属性的对象的集合(抽象)
2)对象:对象就是类的实例(具体)
1.1.类的声明
python中所有的数据类型本质都是类,每种类型对应的数据都是对象
int类是所有整数的集合(每个单独的整数都是int的对象)
声明类就是自定义类型
1)语法:
class 类名():
类的内容
2)说明
class - 声明类的关键字
类名 -- 自己命名。标识符,不能是关键字;
见名知义,驼峰式命名,首字母大写,后面每个单词的首字母都大写
类的内容 -- 主要包含三个内容:类的说明文档、属性、方法(功能)
补充:方法 -- 声明在类中的函数(方法就是函数)
1.2.创建对象
对象是通过类来创建的
1)语法
类() -- 创建指定类对应的对象
2.类中的方法
类中的方法其实就是声明在类中的函数
python中类中的方法分为三种:对象方法,类方法,静态方法
2.1.对象方法
直接声明在类中的函数就是对象方法, 有个默认参数self,需要通过‘对象.’的方式去调用
- self
对象方法中默认参数self, 在通过对象调用的时候,这个参数不用传参,系统会自动将当前对象传递给它。
哪个对象调用的当前方法,self就是谁
self本质就是当前类的对象,所以对象能做的self都能做
注意:对象方法从语法上来说可以使用'类.'的方式去使用,这样用self会失去存在的意义,不要这样用
2)init方法
python所有的类中都有一个特殊的对象方法:__init__
当通过类取创建对象的时候,系统会自动调用__init__方法,来对对象进行初始化操作
补充:python中以\‘_'并且以'_'结尾的方法叫魔法方法。
所有的魔法方法都不需要程序员手动调用,系统会在需要的情况下自动调用
- 构造方法
函数名和类名一样的方法就是构造方法
python中,当我们声明类的时候,系统会自动给我们创建这个类的构造方法
方法中会先在内存中开辟内存空间创建对象,然后用创建好的对象来调用_init_方法对对象进行初始化
初始化完成后才将对象返回
创建对象的时候是否需要参数以及个数,看init方法需要几个参数
声明类的时候同时在系统中自动声明了一个与类名一样的函数,来创建对象
def Dog(args, *kwargs):
对象 = 创建对象(在内存中开辟空间创建对象)
对象._init_(*args, **kwargs)
return 对象
print('==========模拟init构造方法============')
def \__init__(name):
print('模仿init', name)
def dog1(*args, **kwargs):
# 创建对象
\__init__(*args, **kwargs)
# 返回对象
dog1('xiaoming')
3.属性
3.1.属性分为:类的字段、对象属性
1)类的字段
a. 声明: 直接声明在类中的变量就是类的字段
b. 怎么使用: 通过'类.'的方式去使用
c. 使用时间:属性的值不会因为对象不同而不同,就使用类的字段
2)对象属性
a. 声明:对象属性需要声明在init方法中.以''self.属性 = 值'的方式来声明
b. 怎么使用:通过'对象.'的方式去使用
c. 什么时候使用:属性的值会因为对象不同而不同,就使用对象属性
3.2.对象属性的增删改查
属性的增删改查只针对单个对象
查 -- 获取对象属性的值
a. 点语法 -- 对象.属性
b. getattr(对象,属性名) -- 如果属性名不存在,则报错
getattr(对象,属性名,默认值) -- 如果属性名不存在,则返回默认值增/改 -- 添加属性
a. 对象.属性 = 值 -- 当属性存在的时候修改属性的值,当属性不存在的时候,添加属性
b. setattr(对象,属性名,值) -- 当属性存在的时候修改属性的值,当属性不存在的时候,添加属性删 -- 删除对象属性
a. del 对象.属性
b. delattr(对象, 属性名)
_slot_魔法
通过给slots赋值一个元祖,来约束对象属性
3.3 内置属性:声明类的时候,系统自动为类添加的属性
- _name_
字段,获取类的类名
print(Car)
print(Car.\__name__)
2)_doc_
字段,获取类的说明文档
print(Car.\__doc__)
- _class_
对象属性,获取对象的类
print(car1.\__class__)
print([1, 2].\__class__)
- _dict_
字段(声明在类中的变量),获取当前类中所有的字段及其对应的值
对象属性,获取当前对象中所有的对象的属性和对应的值
print(Car.\__dict__)
print(car1.\__dict__)
- __ module__
字段,获取类的声明所在文件的模块的名字
print(Car.\__module__)
- _bases_
字段,获取当前类的父类
print(Car.\__bases__)