Python 面向对象核心实战:封装、继承、多态、抽象类、枚举、单例完整示例 📅 2026/8/11 3:18:52 本文把 Python 面向对象高频知识点全部落地包含封装继承多态、多继承、抽象类、枚举类、访问权限、属性封装、单例模式构造函数 / 装饰器两种写法全部可直接运行。目录前言1. 封装、继承、多态基础案例2. 多继承3. 抽象类4. 枚举类5. 数据的访问级别6. 属性的封装 property7. 单例类构造函数写法 装饰器写法方式 1重写__new__构造函数实现单例方式 2装饰器实现单例总结速查表拓展思考前言面向对象编程 (OOP) 是 Python 开发的核心封装、继承、多态是三大基石除此之外多继承、抽象类、枚举、访问控制、property 属性封装、单例模式都是项目里高频出现的技术点。下面每个知识点附带可运行完整代码。1. 封装、继承、多态基础案例封装把属性和方法放到类内部对外隐藏内部细节继承子类复用父类代码扩展自己功能多态不同子类重写父类同名方法调用时执行各自逻辑python运行class Animal: 父类动物 def __init__(self, name): # 封装把name封装到实例内部 self.name name def speak(self): 父类方法留给子类重写 raise NotImplementedError(子类必须实现speak方法) class Dog(Animal): def speak(self): print(f{self.name}汪汪汪) class Cat(Animal): def speak(self): print(f{self.name}喵喵喵) # 多态同一个方法不同对象表现不同行为 def animal_sound(animal: Animal): animal.speak() if __name__ __main__: dog Dog(小狗) cat Cat(小猫) animal_sound(dog) animal_sound(cat)运行输出plaintext小狗汪汪汪 小猫喵喵喵2. 多继承Python 支持一个类同时继承多个父类注意 MRO 方法解析顺序。python运行class A: def func(self): print(A类的func) class B: def func(self): print(B类的func) # 多继承同时继承A、B class C(A, B): pass if __name__ __main__: c C() c.func() # 查看继承搜索顺序MRO print(C.__mro__)注意继承顺序class C(A,B)查找方法优先找 A找不到再找 B。3. 抽象类抽象类强制子类必须实现指定方法自身不能实例化。Python 使用abc模块。python运行from abc import ABC, abstractmethod class BasePay(ABC): 支付抽象类定义规范 abstractmethod def pay(self, money): 子类必须实现pay方法 pass class AliPay(BasePay): def pay(self, money): print(f支付宝支付{money}元) class WechatPay(BasePay): def pay(self, money): print(f微信支付{money}元) if __name__ __main__: # base BasePay() # 抽象类不能实例化会报错 ali AliPay() ali.pay(100) wechat WechatPay() wechat.pay(200)4. 枚举类枚举用来定义一组固定常量避免魔法数字使用enum.Enum。python运行from enum import Enum class StatusEnum(Enum): # 枚举常量 SUCCESS 200 FAIL 500 TIMEOUT 408 if __name__ __main__: print(StatusEnum.SUCCESS) print(StatusEnum.SUCCESS.name) print(StatusEnum.SUCCESS.value) # 遍历所有枚举 for item in StatusEnum: print(item.name, item.value)5. 数据的访问级别Python 没有真正私有靠命名约定区分访问权限public普通属性外部随便访问_protected单下划线保护约定不要外部直接访问__private双下划线私有会发生名字重整外部不能直接访问python运行class Person: def __init__(self): self.name 张三 # 公开 self._age 20 # 保护 self.__id_card 123456 # 私有 if __name__ __main__: p Person() print(p.name) print(p._age) # print(p.__id_card) # 直接访问私有属性报错 # 实际被重命名为 _Person__id_card仅做演示不建议这么写 print(p._Person__id_card)约定单下划线_xxx不要在类外部读写双下划线__xxx为私有禁止外部访问。6. 属性的封装 property使用property把方法伪装成属性实现 getter、setter对属性赋值做校验完成属性封装。python运行class Student: def __init__(self): self.__score 0 property def score(self): getter 获取分数 return self.__score score.setter def score(self, value): setter 设置分数增加校验逻辑 if not isinstance(value, int): raise ValueError(分数必须是整数) if 0 value 100: self.__score value else: raise ValueError(分数必须在0‑100之间) if __name__ __main__: s Student() s.score 88 print(s.score) # s.score 200 # 会抛出异常7. 单例类构造函数写法 装饰器写法单例整个程序中这个类只能有一个实例对象。方式 1重写__new__构造函数实现单例python运行class SingletonNew: _instance None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance super().__new__(cls) return cls._instance if __name__ __main__: obj1 SingletonNew() obj2 SingletonNew() print(obj1 is obj2) # True同一个对象方式 2装饰器实现单例python运行def singleton_decorator(cls): instance {} def wrapper(*args, **kwargs): if cls not in instance: instance[cls] cls(*args, **kwargs) return instance[cls] return wrapper singleton_decorator class SingletonDecorator: pass if __name__ __main__: a1 SingletonDecorator() a2 SingletonDecorator() print(a1 is a2) # True总结速查表表格知识点核心要点封装把属性方法封装在类内部对外隐藏细节继承子类复用父类代码class Son(Father)多态不同子类重写同一方法调用表现不同行为多继承class C(A,B)MRO 决定方法查找顺序抽象类ABCabstractmethod强制子类实现方法不能实例化枚举类Enum管理固定常量消除魔法数字访问级别公开、_保护、__私有命名约定控制访问属性封装property把方法当属性做赋值校验单例__new__重写 / 装饰器保证全局唯一实例拓展思考多继承场景下 MRO 顺序怎么看类名.__mro__property 除了 setter还有 deleter 删除属性单例模式在多线程下会有线程安全问题需要加锁。