一、异常(exception)
1.异常捕获
- 正常情况下程序出现异常,程序会直接崩溃,不能接着往后执行;
- 异常捕获就是为了让程序出现异常的时候不崩溃,自己处理异常
2.异常捕获语法
1)语法一:try-except(可以捕获所有异常)
- 执行过程:先执行代码块1,在执行代码块1的过程中如果出现异常,程序不崩溃直接执行代码块2;如果没有出现异常,不执行代码块2直接执行其他语句
try:
代码块1
except:
代码块2
其他语句
2)语法二:
- 执行过程:先执行代码段1,如果在执行代码段1的过程中出现异常,检查出现的异常类型是否和except后面的异常类型一致,如果一致程序不崩溃,直接执行代码段2;如果不一致,程序直接崩溃
- 如果没有异常,直接执行后面其他语句
try:
代码段1
except 异常类型:
代码段2
其他语句
3)语法三:
- 捕获指定的多种异常
try:
代码段1
except (异常类型1,异常类型2,...):
代码段2
其他语句
4)语法四:
try:
代码块1
except 异常类型1:
代码块2
except 异常类型2:
代码块3
...
其他语句
5)以上四种结构的最后都可以加上一个finally
- 不管try里面的代码有没有异常,异常有没有被捕获,finally后面的代码都会执行
- 一般可以在finally这个地方做一些数据的保存和备份操作
try:
代码块1
except:
代码块2
finally:
代码块3
其他语句
3.抛出异常:主动让程序崩溃
1)语法:
raise 异常类型
- 注意:异常类型可以是系统自带的,也可以是程序员自定义 (要求异常类型必须是Exception的子类)
4.常见异常类型
- IndexError
- ValueError
- KeyError
二、面向对象(object)
1.编程思想
- 面向过程编程:一遇到问题就考虑通过代码一步一步的去解决问题
- 函数式编程:一遇到问题就考虑是否能够有这样功能的一个函数
- 面向对象编程:一遇到问题就考虑是否有这样一个类,拥有相应的功能和属性
2.什么是类,什么是对象
- 类:类是拥有相同功能和相同属性的对象的集合(抽象的)
- 对象:对象就是类的实例(具体)
3.类的声明
- python中所有的数据类型本质都是类,每种类型对应的数据都是对象
- 例如:int类是所有整数的集合(每个单独的整数都是int的对象)
- 声明类就是自定义类型
1)语法
class 类名:
类的内容
'''
类的说明文档
类的属性(字段,对象属性)
类中的方法(对象方法、类方法、静态方法):功能、函数
'''
2)说明
- class:声明类的关键字
- 类名:自己命名,是标识符不能是关键字;见名知义,首字母大写,并且采用驼峰式命名(如果名字由多个单词组成,单词之间采用单词首字母大写的方式进行区分)
- ::固定写法
- 类的内容:类的说明文档、属性、方法(功能)
- 补充:什么是方法:声明在类中的函数(方法就是函数)
4.创建对象
- 对象是通过类来创建的
1)语法
- 类():创建指定类对应的对象
class Person:
"""类的说明文档: 人类"""
def eat(self):
print('吃东西!')
p1 = Person()
print(p1)
p2 = Person()
print(p2)
5.类中的方法
- 类中的方法其实就是声明在类中的函数
- 类中的方法分为三种:对象方法、类方法、静态方法
1)对象方法
- 直接声明在类中的函数就是对象方法,有个默认参数self,需要使用“ 对象.对象方法() ”的方式去调用
- (对象方法从语法上来说可以使用“ 类. ”的方式去使用,但这样用self会失去它存在的意义,所以不这样用)
1.1) self
- 对象方法中默认参数self,在通过对象调用的时候,这个参数不用传参,系统会自动将当前对象传递给它;
- 哪个对象调用的当前方法,self就是谁
- self本质就是当前类的对象,所以对象能做的事情self都能做
class Person:
def eat(self, food='米饭'):
# self = p1
# self = p2
print('self:', self)
print('吃东西!')
self.run()
def run(self):
# self = p1
# self = p2
# self = p1
print('跑步')
p1 = Person()
p2 = Person()
print(p1, p2)
# p1.eat()
p2.eat()
p1.run()
2)init方法
- python所有的类中都有一个特殊的对象方法:__ init __
- 当通过类去创建对象的时候,系统会自动调用__ init __方法,来对对象进行初始化操作
- 补充:python中以“ __ ”开头并且以“ __ ”结尾的方法叫魔法方法,所有的魔法方法都不需要程序员手动调用,系统会在需要的情况下自动调用
3)构造方法
- 函数名和类名一样的方法就是构造方法
- python中,当我们声明类的时候,系统会自动给我们创建这个类的构造方法
- 方法中会先在内存中开辟空间创建对象,然后用创建好的对象去调用__ init __方法对对象进行初始化
- 初始化完成后才能将对象返回
- 创建对象的时候需不需要参数,要几个参数,看init方法
构造方法的伪代码
def Dog(*args, **kwarges):
对象 = 创建对象(在内存中开辟空间创建对象)
对象.__init__(*args, **kwarges)
return 对象
6.属性
- 属性分为:类的字段、对象属性
1)类的字段
- 声明:直接声明在类中的变量就是类的字段
- 怎么使用:通过“ 类.字段 ”的方式去使用
- 什么时候用:属性的值不会因为对象不同而不同,就使用类的字段
2)对象属性
- 声明:对象属性需要声明在init方法中,以“ self.属性=值 ”的方式来声明
- 怎么使用:通过“ 对象.属性 ”的方式去使用
- 什么时候用:属性的值会因为对象不同而不同,就使用对象属性
class Person:
"""类的说明文档: 人类"""
# 1.属性
num = 61
def __init__(self, name1, age1=0):
# 这儿的name和age就是Person类的对象属性
self.name = name1
self.age = age1
# 2.方法
# 使用字段
Person.num = 60
print(Person.num)
# 使用对象属性
p1 = Person('小明')
print(p1.name, p1.age)
p2 = Person('小花', 3)
print(p2.name, p2.age)
3)练习
# 练习: 声明一个Dog类,有属性: 名字、年龄、颜色、品种。
# 要求创建Dog对象的时候名字和颜色必须赋值,年龄可以赋值也可以不赋值,品种不能赋值!
# 有一个吃的方法,要求不同的Dog对象,调用这个方法的时候打印'XXX(名字)在吃XXX(吃的东西)'
class Dog:
"""狗类"""
# 属性
def __init__(self, name1, color1, age1=0):
self.name = name1
self.age = age1
self.color = color1
self.type = '无'
# 方法
def eat(self, food: str):
print('%s在吃%s' % (self.name, food))
dog1 = Dog('花花', '白色', 3)
dog1.type = '泰迪'
dog2 = Dog('财财', '黄色', 1)
dog2.type = '中华田园犬'
print(dog1.name, dog2.name)
dog1.eat('骨头')
dog2.eat('屎~')
7.对象属性的增删改查
1)查:获取对象属性的值
- 对象.属性:获取对象属性的值,属性不存在会报错
- getattr(对象,属性名):获取对象属性的值,属性不存在会报错
- getattr(对象,属性名,默认值):获取对象属性的值,属性不存在不会报错,并且返回默认值
2)增/改:添加/修改属性
- 对象.属性 = 值 :当属性存在的时候修改属性的值,当属性不存在的时候添加属性
- setattr(对象,属性名,值):当属性存在的时候修改属性的值,当属性不存在的时候添加属性
3)删:删除对象属性
- del 对象.属性
- delattr(对象,属性名)
注意:对象属性的增删改查只针对单个对象,另attr方法中的属性名为字符串格式
4) __ slots __ 魔法
- 在类中可以通过给 __ slots __ 赋值来约束当前类的对象有哪些对象属性
- 注意:如果设置字段 __ slots __ 的值,那么当前类的对象就不能再使用 __ dict __ 属性
8.内置类属性
- 声明类的时候系统自动给类添加的属性
1)__ name __
- 字段:获取类的类名
2)__ doc __
- 字段:获取类的说明文档
3)__ class __
- 对象属性:获取对象的类
4)__ dict __(重要)
- 字段:获取当前类所有的字段和字段对应的值,以字典的形式返回(了解)
- 对象属性:获取当前对象中所有的对象属性和对应的值
5)__ module __
- 字段:获取当前类所在(声明在哪儿)的模块的名字
6)__ bases __
- 字段:获取当前类的父类,返回的是元组格式
9.补充
- __ str __和__ repr __
class Person:
def __init__(self, name):
print('init方法', name)
self.name = name
# 定制,单独打印对象的时候的样式。返回值是什么就打印什么(要求返回值的类型必须是字符串)
def __str__(self):
# 打印的谁self就是谁
return '<'+str(self.__dict__)[1:-1]+'>'
# 定制,打印对象的时候的样式。返回值是什么就打印什么(要求返回值的类型必须是字符串)
def __repr__(self):
return '<' + str(self.__dict__)[1:-1] + '>'
print(Person('abc').__str__())