目录名称前言1. 面向对象1.1 面向对象基础1.2 封装1.3 继承1.4 多态1.5 魔法方法1.6 实例属性与类属性2. 异常2.1 定义2.2 异常处理2.3 异常的传递结语 博主名称超级苦力怕 个人专栏《Python 基础》 每一次思考都是突破的前奏每一次复盘都是精进的开始前言本文是 Python 基础系列的核心篇章系统讲解面向对象编程类、对象、封装、继承、多态、魔法方法、类属性与实例属性以及异常处理机制。1. 面向对象1.1 面向对象基础面向过程把一个需求分解成一系列要执行的步骤然后依次执行关注流程、步骤适合简单、线性的任务。类一组具有相同属性特征和方法功能/行为的模板。对象面向对象编程的基本单元是类的实例将数据和操作打包在一起。提示对象是由类创建出来的一个类可以创建无数个对象创建对象的过程也叫对象的实例化。# 定义类class类名:def__init__(self,参数列表):# 函数定义在类里叫方法self.属性名参数值# 变量定义在类里叫属性self.属性名参数值def方法名(self,形参列表):# 方法体pass# 创建对象对象名类名(参数值1,参数值2)示例classCar:def__init__(self,brand,name,price):self.brandbrand self.namename self.pricepricedefrunning(self):print(f{self.brand}{self.name}正在行驶...)# 创建对象c1Car(BMW,X5,500000)c1.running()说明类名采用大驼峰命名法每个单词首字母都是大写单位之间没有分隔符如UserAccount。__init__是初始化方法在对象创建时自动调用用于初始化属性self代表当前实例调用时无需传递。通过对象.属性或对象.方法()访问成员。1.2 封装封装将数据属性和操作数据的方法行为包装在类内部对外隐藏实现细节只暴露必要的接口。通过控制属性的访问权限保证数据安全。Python 中没有严格的访问控制通常使用单下划线_或双下划线__表示“受保护的”或“私有的”属性并提供getter/setter方法classBankAccount:def__init__(self,owner,balance):self.ownerowner self.__balancebalance# 私有属性# getter 方法获取余额defget_balance(self):returnself.__balance# setter 方法修改余额带校验defset_balance(self,amount):ifamount0:print(余额不能为负数)returnself.__balanceamountdefdeposit(self,amount):ifamount0:self.__balanceamountprint(amount)# 仅打印存入金额else:print(存款金额必须为正数)defwithdraw(self,amount):if0amountself.__balance:self.__balance-amountprint(amount)# 仅打印取出金额else:print(余额不足或金额无效)# 存钱accBankAccount(张三,1000)acc.deposit(500)# 输出: 500acc.withdraw(200)# 输出: 200print(acc.get_balance())# 输出: 1300# 通过 setter 修改余额acc.set_balance(2000)print(acc.get_balance())# 输出: 2000# 尝试直接访问私有属性会报错但可通过特殊方式访问不推荐# print(acc.__balance) # AttributeError拓展 也可以使用property装饰器来实现封装property定义 getter 方法当我们获取 balance 的时候会自动执行这个方法返回self.__balancebalance.setter定义 setter 方法当执行 acc.balance 2000 时会自动调用该方法将等号右边的值传入。classBankAccount:def__init__(self,owner,balance):self.ownerowner self.__balancebalancepropertydefbalance(self):returnself.__balancebalance.setterdefbalance(self,amount):ifamount0:print(余额不能为负数)returnself.__balanceamountdefdeposit(self,amount):ifamount0:self.__balanceamountprint(amount)else:print(存款金额必须为正数)defwithdraw(self,amount):if0amountself.__balance:self.__balance-amountprint(amount)else:print(余额不足或金额无效)# ---------- 使用示例补充 ----------acc2BankAccount(李四,2000)print(acc2.balance)# 通过属性直接获取余额输出 2000acc2.balance3000# 通过属性直接设置余额调用 setterprint(acc2.balance)# 输出 3000acc2.deposit(500)# 输出 500print(acc2.balance)# 输出 3500注意封装是一种约定和防意外的机制并非严格的安全保障封装的好处通过 getter/setter 控制数据读写逻辑避免外部直接赋值无效值同时可以在内部进行数据校验、类型转换、以及触发其他操作提高代码可维护性。1.3 继承继承子类可以继承父类的属性和方法实现代码复用并可以在子类中扩展或重写父类的功能。# 父类classVehicle:def__init__(self,brand,model):self.brandbrand self.modelmodeldefstart(self):print(self.brand,self.model,启动...)# 子类classCar(Vehicle):def__init__(self,brand,model,doors):super().__init__(brand,model)# 调用父类构造方法self.doorsdoorsdefhonk(self):print(self.brand,self.model,鸣笛滴滴~)# 使用carCar(BMW,X5,4)car.start()# 输出BMW X5 启动...car.honk()# 输出BMW X5 鸣笛滴滴~方法重写子类可以重新定义父类中的方法提供自己的实现。classElectricCar(Car):def__init__(self,brand,model,doors,battery):super().__init__(brand,model,doors)self.batterybattery# 重写 start 方法defstart(self):print(self.brand,self.model,无声启动电量,self.battery,kWh)e_carElectricCar(Tesla,Model 3,4,75)e_car.start()# 输出Tesla Model 3 无声启动电量 75 kWh注意super()用于调用父类的方法确保父类的初始化逻辑被执行。Python 支持多重继承一个子类可继承多个父类但复杂场景下容易引发问题建议谨慎使用。1.4 多态多态同一操作作用于不同对象时可以产生不同的执行结果。它允许使用统一的方式处理不同类型的对象提高代码的灵活性和可扩展性。defvehicle_test(vehicle):统一接口不同对象表现出不同行为vehicle.start()# 创建不同类型的对象vehicles[Car(Audi,A6,4),ElectricCar(Tesla,Model 3,4,75)]forvinvehicles:vehicle_test(v)# 自动调用各自类中的 start 方法多态的实现不依赖特殊的语法只需保证不同类中有相同名称的方法即可。Python 进一步强化了多态只要对象有需要的方法就可以当作所需类型使用。classBicycle:defstart(self):print(自行车开始骑行)vehicles.append(Bicycle())vehicle_test(vehicles[-1])# 输出自行车开始骑行1.5 魔法方法魔法方法特殊方法是以双下划线开头和结尾的方法Python 会在特定场景下自动调用用于定义类的特殊行为。魔法方法描述__init__(self, ...)构造方法创建对象时自动调用__str__(self)定义print(对象)或str(对象)的输出内容__repr__(self)定义对象的官方字符串表示常用于调试__eq__(self, other)定义操作符的行为__lt__(self, other)定义操作符的行为其他比较操作符类似__len__(self)定义len(对象)的行为__getitem__(self, key)定义通过索引或键访问元素的行为示例classStudent:def__init__(self,name,score):self.namename self.scorescoredef__str__(self):returnf学生{self.name}成绩{self.score}def__eq__(self,other):returnself.scoreother.scoredef__lt__(self,other):returnself.scoreother.score s1Student(张三,85)s2Student(李四,92)print(s1)# 输出学生张三成绩85print(s1s2)# Falseprint(s1s2)# True注意魔法方法不需要手动调用Python 在相应操作发生时自动调用它们。1.6 实例属性与类属性实例属性属于每个具体对象通过self定义每个对象独立拥有。类属性属于类本身所有实例共享通过类名或self.__class__访问常用于配置或共享数据。classCar:# 类属性所有实例共享wheels4tax_rate0.1def__init__(self,brand,name,price):# 实例属性每个对象独立self.brandbrand self.namename self.pricepricedeftotal_cost(self):# 访问实例属性 price 和类属性 tax_ratereturnself.price*(1Car.tax_rate)# 访问类属性print(Car.wheels)# 4c1Car(BMW,X5,500000)c2Car(Audi,A6,450000)print(c1.wheels)# 4通过实例也能访问类属性print(c2.total_cost())# 495000.0# 修改类属性会影响所有实例Car.tax_rate0.12print(c1.total_cost())# 560000.0查找顺序当通过实例访问属性时Python 会先查找实例属性如果不存在则查找类属性。实例属性会“遮盖”同名的类属性但类属性本身不会被修改。c1.wheels3# 为实例 c1 添加实例属性 wheels不会影响类属性print(c1.wheels)# 3print(Car.wheels)# 4print(c2.wheels)# 42. 异常2.1 定义异常程序运行过程中出现的错误会中断程序的正常执行流程作用保证数据、逻辑正确性避免程序执行混乱在开发阶段尽量发现更多问题尽早解决保障程序正常执行2.2 异常处理程序运行过程出现异常我们可以选择不做处理或捕获异常如果我们捕获并处理异常程序会继续执行(编写程序做好预案出现异常按预案处理)。当程序处于 try 语句内报错会从上至下匹配直到匹配成功进行解决程序继续运行# 定义语法try:可能出现异常的业务代码1可能出现异常的业务代码2...except[异常类型as变量名]出现异常时预案finally:不管是否出现异常都会执行的代码# 示例try:print()print(my_name)# 这里没有定义该变量会被捕获print()exceptNameErrorase:print(程序运行报错错误信息,e)finally:print(释放资源 ~)2.3 异常的传递一场传递就是异常在函数调用中层层上报的过程直到有人处理它或程序崩溃deffun1():print(fun1 ... running ...)fun2()# 调用fun2异常会从这里传递上去deffun2():print(fun2 ... running ...)fun3()# 调用fun3异常会从这里传递上去deffun3():print(fun3 ... running ...)print(my_color)# NameError: name my_color is not defined异常在这里发生if__name____main__:fun1()# 调用fun1异常会沿着调用链传递到这里结语本文全面讲解了 Python 面向对象编程类、对象、封装、继承、多态、魔法方法、属性分类以及异常处理的核心知识。通过这篇文章能够理解如何设计类、控制访问、复用代码、处理运行时错误。如果本文对你有帮助欢迎点赞、收藏让更多正在学 Python 的同学看到。遇到问题或有不同理解可以在评论区留言一起讨论、互相学习。想系统看更多内容可以关注专栏《Python 基础》一起把基础打牢。