Python 面向对象基础讲解 📅 发布时间:2026/8/26 16:11:51 👁 浏览次数: 文章目录一、类与对象二、__init__ 与 self三、实例属性 vs 类属性四、继承Inheritance使用 super() 调用父类方法五、封装命名约定六、常用特殊方法魔术方法七、多态简单理解八、什么时候该用类面向对象编程OOP是把数据和操作数据的方法组织在一起的编程方式。Python 对面向对象的支持非常灵活既有完整的 OOP 特性也保留了函数式的简洁。一、类与对象类Class是模板对象Object / Instance是根据模板创建出来的实例。classDog:狗类pass# 创建对象实例化dog1Dog()dog2Dog()print(type(dog1))# class __main__.Dogprint(dog1isdog2)# False两个不同的对象二、__init__与self__init__是初始化方法创建对象时自动调用。self代表当前实例本身必须作为实例方法的第一个参数。classDog:def__init__(self,name:str,age:int):self.namename# 实例属性self.ageagedefbark(self)-None:print(f{self.name}汪汪)defget_info(self)-str:returnf{self.name}{self.age}岁dogDog(旺财,3)dog.bark()# 旺财汪汪print(dog.get_info())# 旺财3岁print(dog.name)# 旺财要点self.name name是在给当前对象添加属性调用方法时不需要传selfPython 会自动把对象传进去三、实例属性 vs 类属性classDog:species犬科# 类属性所有实例共享def__init__(self,name:str):self.namename# 实例属性每个对象独有dog1Dog(旺财)dog2Dog(小白)print(dog1.species)# 犬科print(dog2.species)# 犬科print(Dog.species)# 犬科也可以通过类访问dog1.name大黄# 只修改了 dog1 的实例属性print(dog1.name)# 大黄print(dog2.name)# 小白区别总结类型定义位置归属修改影响实例属性__init__中每个对象只影响当前对象类属性类体内直接定义类本身影响所有实例四、继承Inheritance子类可以继承父类的属性和方法并可以重写或扩展。classAnimal:def__init__(self,name:str):self.namenamedefspeak(self)-None:print(f{self.name}发出了声音)classDog(Animal):# 继承 Animaldefspeak(self)-None:# 重写父类方法print(f{self.name}汪汪)classCat(Animal):defspeak(self)-None:print(f{self.name}喵喵)dogDog(旺财)catCat(咪咪)dog.speak()# 旺财汪汪cat.speak()# 咪咪喵喵使用super()调用父类方法classDog(Animal):def__init__(self,name:str,breed:str):super().__init__(name)# 调用父类的 __init__self.breedbreeddefspeak(self)-None:super().speak()# 先执行父类逻辑可选print(f{self.name}是{self.breed}汪汪)五、封装命名约定Python 没有真正的私有属性但有约定classBankAccount:def__init__(self,owner:str,balance:float):self.ownerowner# 公开self._balancebalance# 受保护约定内部使用self.__secret密码# 名义私有名称改写defget_balance(self)-float:returnself._balancedefdeposit(self,amount:float)-None:ifamount0:self._balanceamount_balance单下划线表示“内部使用别随便动”__secret双下划线会触发名称改写_BankAccount__secret外部不容易直接访问更推荐通过方法来控制访问而不是强依赖双下划线。六、常用特殊方法魔术方法让对象更“像内置类型”classDog:def__init__(self,name:str,age:int):self.namename self.ageagedef__str__(self)-str:print(对象) 时调用returnf狗狗{self.name}{self.age}岁def__repr__(self)-str:开发者调试时看到的表示returnfDog(name{self.name!r}, age{self.age})dogDog(旺财,3)print(dog)# 狗狗 旺财3岁print(repr(dog))# Dog(name旺财, age3)其他常用特殊方法先混个眼熟__len__支持len(obj)__eq__支持__getitem__支持obj[key]七、多态简单理解同一个方法调用不同对象有不同行为animals[Dog(旺财),Cat(咪咪),Dog(小黑)]foranimalinanimals:animal.speak()# 每个对象调用自己的 speak这就是多态的基本体现接口统一行为各异。八、什么时候该用类适合用类的场景有明确的状态数据 行为方法需要创建多个相似的实例存在明显的继承关系想把相关功能组织在一起不适合强行上类的场景只是简单的数据传递 → 用dict、dataclass或NamedTuple只是一组相关函数 → 用模块即可没有状态的工具函数 → 普通函数更合适现代 Python 中很多时候dataclass是更简洁的选择fromdataclassesimportdataclassdataclassclassDog:name:strage:intdefbark(self)-None:print(f{self.name}汪汪) 感谢阅读想了解更多 我的博客网站 | 记录思考分享干货 我的个人主页 | 关于我、开源项目