python基础(面向对象-多态、异常)-----12(20201007)

    科技2025-02-08  28

    面向对象

    一、面向对象的三大特征:

    封装

    将属性和方方法书写到类的里里里面面的操作即为封装 封装可以为属性和方方法添加私有权限

    继承

    子子类默认继承父父类的所有属性和方方法 子子类可以重写父父类属性和方方法

    多态

    传入入不不同的对象,产生生不不同的结果

    二、多态

    多态指的是一一类事物有多种形态,(一一个抽象类有多个子子类,因而而多态的概念依赖于继承)。

    定义:多态是一一种使用用对象的方方式,子子类重写父父类方方法,调用用不不同子子类对象的相同父父类方方法,可以 产生生不不同的执行行行结果 好处:调用用灵活,有了了多态,更更容易易编写出通用用的代码,做出通用用的编程,以适应需求的不不断变 化! 实现步骤:

    定义父父类,并提供公共方方法定义子子类,并重写父父类方方法传递子子类对象给调用用者,可以看到不不同子子类执行行行效果不不同 体验多态 # 1.父类 class Dog(): def eat(self): print('吃骨头') # 2.子类继承父类,并重写父类方法 class Tu_dog(Dog): def eat(self): print('吃肉') class Lang_dog(Dog): def eat(self): print('吃鸡') # 3.定义多态方法 def DogEat(dog): dog.eat() d1 = Lang_dog() DogEat(d1)

    三、类属性和实例例属性

    3.1类属性 设置和访问类属性类属性就是 类对象 所拥有的属性,它被 该类的所有实例例对象 所共有。类属性可以使用用 类对象 或 实例例对象 访问。 class Dog(): name = '狗' def info_print(self): print(name) d1 = Dog() print(d1.name) print(id(d1.name)) print(Dog.name) print(id(Dog.name)) 类属性的优点: 类的实例例 记录的某项数据 始终保持一一致时,则定义类属性。实例例属性 要求 每个对象 为其 单独开辟一一份内存空间 来记录数据,而而 类属性 为全类所共有 ,仅占用用一一份内存,更更加节省内存空间

    -修改类属性

    类属性只能通过类对象修改,不不能通过实例例对象修改,如果通过实例例对象修改类属性,表示的是创建了了 一一个实例例属性。

    class Dog(): name = '狗' def info_print(self): print(name) d1 = Dog() print(d1.name) print(id(d1.name)) print(Dog.name) print(id(Dog.name)) d1.name = '旺财' # Dog.name = '狼狗' print(d1.name) print(id(d1.name)) print(Dog.name) print(id(Dog.name))

    实例例属性

    class Dog(object): def __init__(self): self.age = 5 def info_print(self): print(self.age) wangcai = Dog() print(wangcai.age) # 5 # print(Dog.age) # 报错:实例例属性不不能通过类访问 wangcai.info_print() # 5

    四、类方方法和静态方方法

    类方方法类方方法特点

    第一个形参是类对象的方方法 需要用用装饰器器 @classmethod 来标识其为类方方法,对于类方方法,第一个参数必须是类对象,一般以cls 作为第一一个参数。

    类方方法使用用场景

    当方方法中 需要使用用类对象 (如访问私有类属性等)时,定义类方方法 类方方法一一般和类属性配合使用用

    class Dog(object): __tooth = 10 @classmethod def get_tooth(cls): return cls.__tooth wangcai = Dog() result = wangcai.get_tooth() print(result) 静态方方法静态方方法特点

    需要通过装饰器器 @staticmethod 来进行行行修饰,静态方方法既不不需要传递类对象也不不需要传递实例例对象 (形参没有self/cls)。 静态方方法 也能够通过 实例例对象 和 类对象 去访问。

    静态方方法使用用场景

    当方方法中 既不不需要使用用实例例对象(如实例例对象,实例例属性),也不不需要使用用类对象 (如类属性、类方方 法、创建实例例等)时,定义静态方方法 取消不不需要的参数传递,有利利于 减少不不必要的内存占用用和性能消耗

    class Dog(): @staticmethod def info_print(): print('test') dog = Dog() Dog.info_print() dog.info_print()

    五、总结

    面面向对象三大大特性

    封装 继承 多态

    类属性 归属于类对象的属性,所有对象共有的属性 实例例属性类方方法 @classmethod def xx(): 代码 静态方方法 @staticmethod def xx(): 代码

    异常

    目标:

    了了解异常捕获异常异常的else异常finally异常的传递自自定义异常

    一、了解异常

    当检测到一一个错误时,解释器器就无无法继续执行行行了了,反而而出现了了一一些错误的提示,这就是所谓的"异常"。 例例如:以 r 方方式打开一一个不不存在的文文件。

    二、异常的写法

    语法 try: 可能发生生错误的代码 except: 如果出现异常执行行行的代码 快速体验

    需求:尝试以 r 模式打开文文件,如果文文件不不存在,则以 w 方方式打开。

    try: f = open('test.txt', 'r') except: f = open('test.txt', 'w') 捕获指定异常

    语法

    try: 可能发生生错误的代码 except 异常类型: 如果捕获到该异常类型执行行行的代码 体验 try: print(1/0) except (NameError,ZeroDivisionError) as result: print(result) else: print('没有异常执行的代码') finally: print('无论有没有异常都要执行') 注意: 如果尝试执行行行的代码的异常类型和要捕获的异常类型不不一一致,则无无法捕获异常。一一般try下方方只放一一行行行尝试执行行行的代码。 捕获多个指定异常

    当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用用元组的方方式进行行行书写。

    try: print(1/0) except (NameError, ZeroDivisionError): print('有错误') 捕获异常描述信息 try: print(num) except (NameError, ZeroDivisionError) as result: print(result) 捕获所有异常

    Exception是所有程序异常类的父父类。

    try: print(num) except Exception as result: print(result) 异常的else

    else表示的是如果没有异常要执行行行的代码。

    try: print(1) except Exception as result: print(result) else: print('我是else,是没有异常的时候执行行行的代码') 异常的finally

    finally表示的是无无论是否异常都要执行行行的代码,例例如关闭文文件。

    try: f = open('test.txt', 'r') except Exception as result: f = open('test.txt', 'w') else: print('没有异常,真开心心') finally: f.close()

    三、异常的传递

    体验异常传递

    需求: 尝试只读方方式打开test.txt文文件,如果文文件存在则读取文文件内容,文文件不不存在则提示用用户即可。读取内容要求:尝试循环读取内容,读取过程中如果检测到用用户意外终止止程序,则 except 捕获异常 并提示用用户。 """需求: 1. 尝试只读方方式打开test.txt文文件,如果文文件存在则读取文文件内容,文文件不不存在则提示用用户即可。 2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到用用户意外终止止程序,则 except 捕获异常 并提示用用户。""" import time # import os # f1 = open('test.txt','w') # f1.write('aaaaa\nbbbbb\nccccc\nddddd\neeeee') try: f1 = open('test.txt') try: while True: con = f1.readline() if len(con) == 0: break time.sleep(2) print(con) except: print('异常中断了文件读取') finally: f1.close() print('关闭文件') except: print('没有文件')

    四、自自定义异常

    在Python中,抛出自自定义异常的语法为 raise 异常类对象 。需求:密码⻓长度不不足足,则报异常(用用户输入入密码,如果输入入的⻓长度不不足足3位,则报错,即抛出自自定义异 常,并捕获该异常)。 # 1.自定义异常类 # 编写异常类的原则,一个异常类i描述一个错误 class ShortInputError(Exception): def __init__(self,length,min_length): self.length = length self.min_length = min_length def __str__(self): return f'您输入密码长度为:{self.length },密码不能少于:{self.min_length}' # 2.抛出异常,用raise抛出异常 def main(): # 用户输入密码,长度小于3,抛出异常 try: password = input('请输入密码:') if len(password) < 3: # 抛出异常类创建的 对象 raise ShortInputError(len(password),3) # 3.捕获改异常 except Exception as result: print(result) else: print('没有异常') main()

    五、总结

    异常语法 try: 可能发生生异常的代码 except: 如果出现异常执行行行的代码 else: 没有异常执行行行的代码 finally: 无无论是否异常都要执行行行的代码 捕获异常 except 异常类型: 代码 except 异常类型 as xx: 代码 自自定义异常 # 1. 自自定义异常类 class 异常类类名(Exception): 代码 # 设置抛出异常的描述信息 def __str__(self): return ... # 2. 抛出异常 raise 异常类名() # 捕获异常 except Exception...
    Processed: 0.011, SQL: 8