ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python 面向对象|三大特性|异常处理|模块与包 笔记

Python 面向对象|三大特性|异常处理|模块与包 笔记 一、面向对象的思维方式面向对象是编程思想不是技术重在理解思路找到或者构造一个可以完成功能的主体找到实体功能完备专注构造实体完成功能。面向过程思路一步一步完成功能自上而下逐步细化。关注点分析代码实现的步骤。简单区分面向过程关心怎么做面向对象关心谁来做。二、类和对象类一系列拥有相同或者相似功能的对象集合是一类事物的统称。对象类的具体的表现形式。举例手机就是类苹果手机就是对象。2.1 类的定义经典类class 类名: pass新式类Python3 默认class 类名(object): pass2.2 类的实例化实例化又叫创建对象。实例化后的对象可以调用类中的方法。一个类理论上可以创建无数个对象。# 语法 对象名 类名()2.3 self 关键字self将调用方法的实例传入方法内部在方法内部可以调用实例的属性和方法。2.4 实例属性的添加和获取在类的外部添加和获取实例属性# 添加 对象名.属性名 值 # 获取 对象名.属性名创建对象后对其中一个对象添加实例属性其他对象不会发生变化。在类的内部添加和获取实例属性# 添加 self.属性名 值 # 获取 self.属性名实例属性一般写在实例方法中调用该方法才会得到实例属性一个实例调用不会影响其余对象。2.5__init__()初始化方法__init__在创建对象、初始化对象时自动调用。在__init__中添加的属性每个对象都会拥有称为共有属性。在__init__之外添加的属性不是每个对象都拥有称为独有属性。带参数的__init__方法创建对象时类名()括号内的参数会传递到__init__内部。接收参数可以动态给对象添加实例属性。如果__init__设置了形参创建对象时必须传参否则报错。class Person(object): def __init__(self, name, age): self.name name self.age age p Person(Rose,18)2.6__str__()方法在类内部定义__str__()对象转为 str 类型时自动调用return 返回对应数据。__str__只能返回字符串类型。自动调用场景强制类型转换str(对象)隐式转换%s占位符接收对象、print(对象)打印对象。2.7__del__()析构方法对象释放销毁之前自动执行__del__。对象释放的场景出了函数作用域后局部变量被释放。程序执行完成所有变量被释放。执行del操作可以提前释放变量。class Person(object): def __init__(self,name,age): self.namename self.ageage def __del__(self): print(我被释放了,self.name) p1Person(Rose,18) # del p1 print(程序结束)重要结论 对象被多个变量引用时执行del只是切断一个引用必须切断全部引用对象才会被释放。 函数内部局部变量函数执行结束会释放如果被全局变量引用则不会释放。p4 None def func(): p3 Person(笑傲,15) global p4 p4p3 print(p3) func() print(程序结束了)三、面向对象的三大特性3.1 封装概念将属性和方法写到类的内部使用实例获取功能可以设置私有权限保障接口安全。封装优点对象完成整套业务迭代维护方便。设置私有属性 / 方法提高代码安全性只暴露需要对外的接口。降低类与模块使用难度少量接口即可完成功能。私有属性、私有方法只能在类内部调用类外部无法访问。格式属性 / 方法前面加两条下划线__。get、set 方法get获取私有属性set给私有属性赋值类外部可以调用。好处读写数据时可以做数据校验、数据加工。3.2 继承概念子类对象可以使用父类中非私有属性和方法。class 子类名(父类名): passobject是所有类的顶级基类。新式类括号不写父类默认继承object。单继承一个子类只继承一个父类支持多级继承。子类可以使用父类所有非私有属性、方法。如果父类__init__带参数子类实例化的时候必须传参。多继承一个子类同时继承多个父类。class 子类名(父类1,父类2): pass子类可以使用多个父类非私有属性和方法。如果父类存在同名方法 / 属性优先使用靠前父类的内容。子类重写父类方法子类定义和父类同名方法调用时执行子类方法不再执行父类。只要求方法名字相同参数不需要校对。查找顺序优先找子类再向上找父类。子类调用父类方法super().方法名()调用直接父类方法父类名.方法名(self)指定父类调用必须手动传入 selfsuper(当前类名, self).方法名()指定查找起始类使用场景重写父类方法之后保留父类逻辑做功能扩展。3.3 多态在继承关系中子类重写父类同名方法把不同子类对象传入函数调用同一个方法产生不同执行效果称为多态。前提继承 方法重写。3.4 类属性类属性定义在类内部、方法外部属于全部对象共享修改类属性所有对象同步变化。实例属性对象独有修改一个对象实例属性不会影响其他对象。3.5 类方法适用场景方法内部不需要实例属性、实例方法只操作类属性、类方法。装饰器classmethod默认参数cls代表当前类本身。class Demo: num 10 classmethod def test(cls): print(cls.num)3.6 静态方法既不依赖实例对象也不依赖类。装饰器staticmethod没有默认参数一般是工具函数为了封装放到类中。class Demo: staticmethod def tool(): print(静态方法)四、异常4.1 异常捕获使用try...except捕获异常代码报错不会直接终止程序执行 except 内逻辑做异常处理。4.2 捕获指定类型的异常捕获多种异常多个异常放到元组中。try: pass except (ZeroDivisionError, NameError): pass写多个except分别捕获不同异常。Exception可以捕获绝大部分未知异常。4.3 else 和 finallyelsetry 代码块没有异常的时候执行。finally无论是否发生异常一定会执行常用于资源释放。try: pass except Exception: pass else: pass finally: pass4.4 自定义异常抛出自定义异常类必须继承Exception。raise关键字主动抛出异常可以抛出自定义异常或者系统异常。raise 抛出的异常可以被 except 捕获没有捕获则程序终止。class MyErr(Exception): pass raise MyErr(自定义异常)五、Python 模块模块后缀为.py的文件可以存放变量、函数、类、可执行代码。5.1 模块导入方式# 1.导入整个模块 import os # 2.导入模块指定功能 from os import listdir, mkdir # 3.导入模块全部功能 from os import * # 4.别名导入 import os as xitong from os import listdir as ls5.2 自定义模块模块名必须符合标识符命名规则。导入模块时会自动执行模块内部全部代码。测试代码写在if __name__ __main__:中导入模块时不会执行测试代码。if __name__ __main__: # 仅本文件直接运行执行 pass5.3 模块查询顺序通过sys.path查看模块搜索路径列表靠前路径优先查找。开发中手动追加路径sys.path.append(你的路径)。5.4__all____all__ [func1,a]只对from 模块 import *生效控制星号导入可以导入哪些内容。import 模块名、from 模块 import a不受__all__控制。5.5 包的导入包包含__init__.py文件的文件夹用来管理多个模块。# 导入包中指定模块 import 包名.模块名 # 从包导入模块 from 包名 import 模块名 # from 包名 import * # 需要在 __init__.py 文件配置 __all__ [模块名]
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进