面向对象编程OOP是Python核心编程思想核心四大特性封装、继承、多态、抽象本文重点讲解考试/面试/实操高频的前三者。本文专为课堂演示设计所有代码可直接复制运行同时搭配错误案例让学生通过「正确运行看效果、报错调试懂规则」彻底吃透OOP核心语法与底层逻辑。本文核心知识点全覆盖属性分类按归属类属性、实例属性、静态属性、按访问权限公共、保护、私有方法分类实例方法、类方法、静态方法、私有/保护/公共方法核心语法构造函数__init__、析构函数三大特性封装、继承、多态全套正反例一、Python 类与对象基础对象是「具体的事物」类是「事物的模板」。所有OOP的属性、方法都依托类和对象实现。1.1 最简类与对象示例正例# 定义类classStudent:pass# 创建对象实例化stu1Student()stu2Student()print(stu1)print(stu2)运行结果输出两个不同的内存地址代表两个独立对象。核心结论同一个类可以实例化出无数个独立对象。二、属性全套详解分类正反例报错解析属性是类/对象的变量分为两大分类维度按归属划分、按访问权限划分。2.1 按归属划分类属性、实例属性、静态属性2.1.1 实例属性属于对象每个对象独有定义在构造函数__init__中通过self.属性名定义每个对象的实例属性相互独立、互不干扰。正例代码正常运行classStudent:# 构造函数初始化实例属性def__init__(self,name,age):self.namename# 实例属性self.ageage# 实例属性# 创建两个独立对象stu1Student(张三,18)stu2Student(李四,20)# 各自属性独立print(stu1.name,stu1.age)# 张三 18print(stu2.name,stu2.age)# 李四 20# 修改单个对象实例属性不影响其他对象stu1.age19print(stu1.age)# 19print(stu2.age)# 20反例代码报错对象无该实例属性classStudent:def__init__(self,name):self.namename stu1Student(张三)print(stu1.age)# 报错报错信息AttributeError: Student object has no attribute age报错原因age 未在构造函数中定义为实例属性对象无法调用未初始化的实例属性。2.1.2 类属性属于类所有对象共享定义在类内部、方法外部不属于任何对象所有实例对象共享同一份类属性修改类属性会影响所有未重写该属性的对象。正例代码正常运行classStudent:# 类属性全局共享school光明小学def__init__(self,name):self.namename# 类属性可以通过 类名/对象名 调用print(Student.school)# 类名调用光明小学stu1Student(张三)stu2Student(李四)print(stu1.school)# 对象调用光明小学print(stu2.school)# 对象调用光明小学# 修改类属性所有对象同步变更Student.school阳光小学print(stu1.school)# 阳光小学print(stu2.school)# 阳光小学易错反例坑点对象赋值类属性不会修改全局类属性Python 是有动态实例属性机制的classStudent:school光明小学def__init__(self,name):self.namename stu1Student(张三)stu1.school私立小学# 看似修改类属性实则给stu1新增实例属性print(Student.school)# 光明小学类属性未变print(stu1.school)# 私立小学优先调用自己的实例属性print(stu2.school)# 光明小学其他对象不受影响核心总结对象直接赋值会创建实例属性覆盖类属性不会修改全局类属性修改类属性必须用类名.属性名。2.1.3 静态属性本质是类属性极少单独使用Python无严格意义的静态属性日常将「全局共享、无需实例化的类变量」统称为静态属性用法和类属性一致。2.2 按访问权限划分公共、保护、私有属性Python无严格的权限修饰符通过命名规范区分访问权限核心靠下划线区分公共属性无下划线name任意位置访问保护属性单下划线_name仅类内部、子类访问约定规范私有属性双下划线__name仅当前类内部访问外部无法直接访问2.2.1 公共属性正例classStudent:def__init__(self):self.name张三# 公共属性stuStudent()print(stu.name)# 外部可直接访问张三2.2.2 保护属性规范约束单下划线只是编程约定外部可强制访问但不推荐。classStudent:def__init__(self):self._age18# 保护属性stuStudent()print(stu._age)# 可强制访问语法不报错违背编码规范2.2.3 私有属性严格权限正反例双下划线私有属性Python会做名称改写外部无法直接访问。正例类内部正常访问classStudent:def__init__(self):self.__score99# 私有属性defget_score(self):# 类内部可以正常访问私有属性returnself.__score stuStudent()print(stu.get_score())# 99反例外部直接访问报错classStudent:def__init__(self):self.__score99stuStudent()print(stu.__score)# 外部直接访问报错报错信息AttributeError: Student object has no attribute __score拓展知识点进阶私有属性被改写为_类名__属性名可强制访问工作中禁止使用print(stu._Student__score)# 99强制破解不推荐类属性 同理。三、方法全套详解分类正反例报错解析方法是类/对象的函数分类维度和属性完全对应按归属实例、类、静态方法、按权限公共、保护、私有方法。3.1 按归属划分三大核心方法3.1.1 实例方法最常用定义第一个参数必须是self只能通过对象调用可以操作实例属性、类属性。正例classStudent:school光明小学def__init__(self,name):self.namename# 实例方法defshow_info(self):print(f姓名{self.name}学校{self.school})stuStudent(张三)stu.show_info()# 姓名张三学校光明小学反例类直接调用实例方法报错Student.show_info()# 报错缺少self参数报错信息TypeError: show_info() missing 1 required positional argument: self3.1.2 类方法classmethod装饰器classmethod修饰第一个参数必须是cls代表类本身可通过类/对象调用只能操作类属性无法操作实例属性。正例classStudent:school光明小学classmethoddefchange_school(cls,new_school):cls.schoolnew_school# 类名调用Student.change_school(育才小学)print(Student.school)# 育才小学# 对象调用stuStudent()stu.change_school(实验小学)print(Student.school)# 实验小学反例类方法调用实例属性报错classStudent:def__init__(self):self.age18classmethoddefget_age(cls):print(cls.age)# 试图调用实例属性Student.get_age()# 报错报错原因类方法无实例对象无法访问实例属性。3.1.3 静态方法staticmethod装饰器staticmethod修饰无默认参数和类、对象无绑定仅作为类的 工具方法无法操作类属性、实例属性。正例classStudent:staticmethoddefcalc_sum(a,b):returnab# 类、对象均可调用print(Student.calc_sum(1,2))# 3stuStudent()print(stu.calc_sum(3,4))# 73.2 按权限划分公共/保护/私有方法命名规则和属性完全一致无下划线公共、单下划线保护、双下划线私有。私有方法正反例classStudent:# 私有方法def__check_score(self,score):returnscore60# 公共方法调用私有方法defget_result(self,score):returnself.__check_score(score)stuStudent()print(stu.get_result(80))# True正常调用print(stu.__check_score(80))# 外部直接调用报错四、构造函数与析构函数核心必考点4.1 构造函数 __init__实例化对象时自动触发用于初始化对象属性无需手动调用。正例带参构造函数classStudent:def__init__(self,name,age):print(对象创建成功自动执行构造函数)self.namename self.ageage stuStudent(张三,18)# 实例化自动执行print(stu.name)反例传参数量不匹配报错stuStudent(张三)# 少传一个参数报错4.2 析构函数 __del__对象被销毁时自动触发用于释放资源。classStudent:def__del__(self):print(对象被销毁执行析构函数)stuStudent()delstu# 主动删除对象触发析构函数五、面向对象三大特性封装、继承、多态正反例精讲5.1 封装OOP核心定义隐藏类的内部细节对外提供统一访问接口保护核心数据安全。核心用法私有属性 公开get/set方法正例标准封装写法classStudent:def__init__(self,score):self.__scorescore# 私有属性隐藏数据# 公开接口获取分数defget_score(self):returnself.__score# 公开接口修改分数增加数据校验defset_score(self,new_score):if0new_score100:self.__scorenew_scoreelse:print(分数不合法修改失败)stuStudent(80)print(stu.get_score())# 80stu.set_score(95)print(stu.get_score())# 95stu.set_score(200)# 分数不合法修改失败封装优势杜绝外部随意篡改数据可通过接口增加校验逻辑保障数据合法性。5.2 继承代码复用核心定义子类继承父类的所有公共/保护属性和方法实现代码复用子类可拓展新功能。语法class 子类名(父类名):5.2.1 单继承正例# 父类classPerson:def__init__(self,name,age):self.namename self.ageagedefshow_person(self):print(f姓名{self.name}年龄{self.age})# 子类继承父类classStudent(Person):# 子类拓展自己的属性def__init__(self,name,age,school):# 调用父类构造函数super().__init__(name,age)self.schoolschool# 子类拓展新方法defshow_student(self):print(f学校{self.school})stuStudent(张三,18,光明小学)stu.show_person()# 继承父类方法姓名张三年龄18stu.show_student()# 子类自有方法学校光明小学5.2.2 继承反例私有属性无法被继承classPerson:def__init__(self):self.__money1000# 私有属性classStudent(Person):defget_money(self):print(self.__money)# 子类无法访问父类私有属性stuStudent()stu.get_money()# 报错核心结论父类私有属性、私有方法无法被子类继承保护、公共属性/方法可正常继承。5.3 多态接口统一实现不同首先说明 Python 语言层面没有 像Java/go 那种独立 interface 关键字。定义父类定义统一接口子类重写父类 方法同一个方法不同子类实现不同效果。多态前提继承 方法重写Python 实现 多态的 方式 主要有以下 3种 约束性依次递减5.3.1 抽象类 推荐Python真正的抽象类必须借助标准库abcAbstract Base Classes继承ABC方法加装饰器abstractmethod满足后抽象类不能实例化子类不重写全部抽象方法实例化子类直接报错。标准抽象类完整正反例课堂可直接运行fromabcimportABC,abstractmethod# 标准抽象类classAnimal(ABC):abstractmethoddefspeak(self):pass# 反例1直接实例化抽象类 → 报错# a Animal()# TypeError: Cant instantiate abstract class Animal with abstract method speak# 反例2子类不重写抽象方法实例化报错classDog(Animal):pass# d Dog()# TypeError: Cant instantiate abstract class Dog with abstract method speak# 正例子类必须重写所有抽象方法才能正常使用classDog(Animal):defspeak(self):print(汪汪汪)dDog()d.speak()# 汪汪汪5.3.2 普通类写pass的空方法只是人为约定没有语法强制# 父类classAnimal:defspeak(self):pass# 子类1重写方法classDog(Animal):defspeak(self):print(汪汪汪)# 子类2重写方法classCat(Animal):defspeak(self):print(喵喵喵)# 多态函数统一接口适配所有子类defanimal_speak(animal:Animal):animal.speak()# 不同对象调用同一个方法效果不同animal_speak(Dog())# 汪汪汪animal_speak(Cat())# 喵喵喵5.3.3 鸭子类型Python原生特色无任何约束classDog:defspeak(self):print(汪)classCat:defspeak(self):print(喵)# 只要有speak方法就能传不需要继承任何父类defmake_sound(animal):animal.speak()make_sound(Dog())make_sound(Cat())