day14总结:异常、面向对象(2019-05-05)

一、异常(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__())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。