AI大模型学习01:Python面向对象基础与封装 大家好我是Tbisnic。从今天从零教大家学习AI大模型今天介绍Python中一个非常核心的概念——面向对象。一开始听到“对象”、“类”、“封装”这些词感觉像在听天书。但学完之后我发现面向对象其实就是让我们像“造物主”一样用代码构建一个个“小世界”。下面我把今天的收获分享给大家希望能帮助大家轻松入门一、两种编程思维就像做菜 vs. 请厨师编程解决问题有两种不同的思路1. 面向过程步骤派核心关注“先做什么后做什么”。例子你要做一盘番茄炒蛋。面向过程就是①洗番茄 → ②切番茄 → ③打蛋 → ④热油 → ⑤炒蛋 → ⑥加番茄 → ⑦调味 → ⑧出锅。每一步自己动手顺序明确。缺点如果换一道菜比如红烧肉所有步骤又要重新设计。2. 面向对象角色派核心关注“谁来做什么”。先设计好“角色”对象然后让角色去完成任务。例子还是做菜。你请了一个厨师对象他有“番茄”、“鸡蛋”、“锅铲”等属性还有“切菜”、“炒菜”等方法。你只需要告诉厨师“做一盘番茄炒蛋”他自己就会调用内部的方法完成。下次你想吃红烧肉还是这个厨师换个指令就行。Python的特点两种风格都支持但面向对象更适合大型项目因为更接近我们认识世界的方式。一句话总结面向过程像写流水账面向对象像拍电影先有演员和剧本再让他们演。二、类与对象图纸和真车1. 什么是类类是一类事物的模板或图纸。它是抽象的不能直接使用。比喻手机厂商设计的一份“手机设计图”上面写着手机应该有屏幕、电池、摄像头属性可以打电话、玩游戏方法。但图纸本身不能拿来打电话。2. 什么是对象对象根据类创建出来的具体个体。它是实实在在的可以使用。比喻工厂按照那份设计图造出了一部真正的“iPhone 15”这部手机能开机、能拍照。这部真机就是对象。3. 核心关系先有类后有对象。没有图纸造不出任何真机。一个类可以创建无数个对象比如小米10、小米11都是同一个类造出来的。4. 定义类与创建对象代码演示# 定义类一个简单的手机模板 class MobilePhone: def call(self): print(正在拨打电话...) # 创建对象造一部真机 my_phone MobilePhone() # 类名() 就是创建对象 my_phone.call() # 输出正在拨打电话...三、self关键字它就是“我自己”问题同一个类创建了多个对象对象调用方法时方法怎么知道是哪个对象在叫我答案self就是那个“我自己”。谁调用方法self就代表谁。例子你和你朋友各有一部同型号手机。当你的手机响时它知道“是你”在接听你朋友的手机响时它知道“是你朋友”在接听。在代码中self就是那个正在操作的对象本身。所以方法内部要用self.属性来操作当前对象的属性。class Dog: def bark(self): print(f{self} 在汪汪叫) # self 就是调用该方法的对象 dog1 Dog() dog2 Dog() dog1.bark() # 这里的 self 就是 dog1 dog2.bark() # 这里的 self 就是 dog2四、对象的属性给对象贴上标签1. 属性是什么属性就是描述对象特征的变量。比如一个人的名字、年龄、身高。2. 在类外部添加/获取属性不推荐class Cat: pass my_cat Cat() my_cat.name 咪咪 # 外部添加属性 print(my_cat.name) # 输出咪咪避坑指南千万不要在类外部随意添加属性因为不同的猫对象可能有的有name有的没有会导致程序混乱。正确的做法是在类内部统一初始化属性。3. 在类内部推荐使用属性通过selfclass Cat: def set_name(self, name): self.name name # 内部给当前对象的 name 赋值 def show(self): print(f我的名字是 {self.name}) my_cat Cat() my_cat.set_name(咪咪) my_cat.show() # 输出我的名字是 咪咪五、魔法方法Python中的“自动触发器”魔法方法就是名字前后都有双下划线__的方法它们会在特定情况下自动被调用不需要你手动写调用语句。1.__init__对象出生时的“第一声啼哭”触发时机当你创建对象时类名()__init__会自动运行。作用用来给对象的属性赋初始值。就像婴儿一出生医生就会给他量身高体重。class Book: def __init__(self, title): # 参数 title 由外部传入 self.title title # 把外部传入的书名保存为属性 print(f一本新书《{self.title}》诞生了) # 创建对象时自动调用 __init__ my_book Book(三体) # 输出一本新书《三体》诞生了2.__str__让打印对象变得“好看”触发时机当你使用print(对象)时自动调用。作用返回一个字符串描述这个对象的信息。如果不写打印对象会输出__main__.Book object at 0x...一串内存地址人类看不懂。class Book: def __init__(self, title): self.title title def __str__(self): return f《{self.title}》是一本很棒的书 my_book Book(三体) print(my_book) # 输出《三体》是一本很棒的书3.__del__对象消亡前的“临终遗言”了解即可触发时机对象被删除del 对象或者程序运行结束时自动调用。作用做一些清理工作比如关闭文件、断开网络连接。一般情况下不需要特意写它。class Animal: def __del__(self): print(对象被销毁了再见) dog Animal() del dog # 输出对象被销毁了再见六、【原创案例】自动售货机 —— 综合运用面向对象为了把上面所有知识串起来我设计了一个自动售货机的案例不使用原笔记中的减肥或烤地瓜。需求分析售货机里有饮料每瓶价格5元。用户可以投币、购买饮料、查看剩余饮料数量。购买时如果余额不足或库存不足给出提示。打印售货机信息时能清晰看到库存和当前收入。步骤定义VendingMachine类。__init__初始化属性beverage_count饮料数量、balance当前投币金额、total_income总收入。提供insert_coin(money)方法投币累加balance。提供buy()方法判断余额是否≥5且库存0是则减少库存、扣除5元余额、增加总收入否则提示失败。提供refill(count)方法补充饮料。__str__方法返回售货机状态。代码实现class VendingMachine: def __init__(self, initial_count): 初始化售货机饮料数量、当前投币金额、总收入 self.beverage_count initial_count self.balance 0 self.total_income 0 def insert_coin(self, money): 投币累加到 balance if money 0: print(请投入正数金额) return self.balance money print(f投币成功当前余额{self.balance} 元) def buy(self): 购买饮料需要余额5 且 库存0 if self.beverage_count 0: print(抱歉饮料已售罄) return if self.balance 5: print(f余额不足还需要 {5 - self.balance} 元) return # 成功购买 self.beverage_count - 1 self.balance - 5 self.total_income 5 print(购买成功请取走饮料。) print(f剩余余额{self.balance} 元剩余饮料{self.beverage_count} 瓶) def refill(self, count): 补充饮料 if count 0: print(补充数量必须大于0) return self.beverage_count count print(f补充 {count} 瓶饮料当前库存{self.beverage_count} 瓶) def __str__(self): return f 售货机状态 \n饮料库存{self.beverage_count} 瓶\n当前投币余额{self.balance} 元\n总收入{self.total_income} 元 # 测试 if __name__ __main__: vm VendingMachine(3) # 初始3瓶饮料 print(vm) vm.insert_coin(10) # 投10元 vm.buy() # 购买一次 vm.buy() # 再买一次余额还剩5元可以买第二瓶 vm.buy() # 再买余额0不够 vm.refill(2) # 补货2瓶 vm.insert_coin(5) vm.buy() # 成功购买 print(vm)运行效果预览 售货机状态 饮料库存3 瓶 当前投币余额0 元 总收入0 元 投币成功当前余额10 元 购买成功请取走饮料。 剩余余额5 元剩余饮料2 瓶 购买成功请取走饮料。 剩余余额0 元剩余饮料1 瓶 余额不足还需要 5 元 补充 2 瓶饮料当前库存3 瓶 投币成功当前余额5 元 购买成功请取走饮料。 剩余余额0 元剩余饮料2 瓶 售货机状态 饮料库存2 瓶 当前投币余额0 元 总收入15 元七、面向对象三大特性概述封装把数据和操作数据的方法打包在一个类内部并隐藏内部细节比如售货机不需要告诉你它怎么找零你只管投币和按按钮。继承子类可以自动拥有父类的所有属性和方法。比如“咖啡售货机”继承自“售货机”再增加煮咖啡的功能。多态同一个方法不同对象调用产生不同结果。比如“猫”和“狗”都有“叫”的方法但猫叫“喵”狗叫“汪”。今天重点学习封装尤其是其中的私有属性和方法。八、封装与私有权限保护你的“核心秘密”1. 为什么需要私有现实世界银行卡密码不能随便让别人看只能由银行系统内部修改。程序世界有些属性或方法不希望被类外部直接访问或修改以免造成数据错乱。2. 如何定义私有属性和方法在属性名或方法名前加双下划线__。class BankAccount: def __init__(self, password): self.__password password # 私有属性外部无法直接访问 def __check_password(self): # 私有方法外部无法直接调用 print(验证密码...) def withdraw(self, money): # 内部可以自由使用私有属性和方法 self.__check_password() print(f取出 {money} 元)3. 访问规则类内部可以随便用self.__私有属性和self.__私有方法()。类外部直接对象.__私有属性会报错AttributeError。子类子类也无法继承父类的私有属性和方法。4. 如果外部非要访问怎么办提供一个公开的“接口方法”getter / setter在内部控制访问逻辑。class BankAccount: def __init__(self, password): self.__password password def get_password(self): # 公开的获取方法 return 密码不可见 def set_password(self, new_pwd): if len(new_pwd) 6: # 可以加校验规则 self.__password new_pwd print(密码修改成功) else: print(密码必须是6位) acc BankAccount(123456) print(acc.get_password()) # 输出密码不可见 acc.set_password(abc) # 输出密码必须是6位 acc.set_password(654321) # 输出密码修改成功这样既保护了数据又允许外界通过安全的方式操作。九、总结今天我们介绍了面向对象和面向过程的区别类和对象图纸与真车self指向当前对象属性添加最好在__init__中统一初始化魔法方法__init__、__str__、__del__综合案例自动售货机面向对象三大特性封装与私有属性和方法给大家的一句话面向对象并不神秘它就是我们看待世界的自然方式。每当你看到一个东西手机、猫、售货机都可以想想它有什么属性它能做什么事情然后试着用类把它描述出来。第一篇AI大模型学习博客就写到这里明天继续学继承和多态。加油我们一起进步