当前位置: 首页 > news >正文

【Python】新手入门:python面向对象编程的三大特性是什么?python继承、封装、多态的特性都有哪些?

🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)

🌵文章目录🌵

  • 🧨引言
    • 🎟️编程范式的演进与面向对象思想的崛起
    • 🎗️面向对象编程的三大支柱
    • 🎁Python实现面向对象特性的独特之处
    • 🧧面向对象设计原则与Python实践
    • 🎑SOLID原则
    • 🎍注意点
    • 🎈本文内容概览
  • 💡一、封装
    • ⚽1.1.封装的目的
    • ⚾1.2.封装的方式
      • 🎯1.2.1.公有属性和方法
      • 🐵1.2.2.私有属性和方法
      • 🐒1.2.3.属性装饰器和方法装饰器
        • 🐔1.2.3.1.属性装饰器
        • 🐤1.2.3.2.方法装饰器
    • 🥎1.3.封装的实现
      • 🐯1.3.1.封装属性
      • 🐈1.3.2.封装方法
    • 🏀1.4.父类与子类的封装
    • 🏐1.5.小结
  • 📝二、继承
    • 🎖️2.1继承的定义
    • 🏆2.2.继承的实现
    • 🏅2.3.方法重写
    • 🥇2.4.object类
  • 🎯三、多态
  • 🤝期待与你共同进步
  • 📚参考文档


🧨引言

🎟️编程范式的演进与面向对象思想的崛起

在计算机编程的发展历程中,编程范式经历了从机器语言到汇编语言,再到高级语言的演变过程。20世纪60年代,随着软件复杂度的不断提升,结构化编程应运而生,它通过顺序、选择和循环三种基本控制结构来组织代码,显著提高了程序的可读性和可维护性。然而,当软件系统规模进一步扩大时,结构化编程在处理复杂系统时的局限性逐渐显现——数据和操作数据的函数分离导致的内聚性不足、模块间耦合度过高等问题日益突出。

正是在这样的背景下,面向对象编程(Object-Oriented Programming, OOP)范式于20世纪70年代开始兴起,并在Smalltalk语言中得到首次完整实现。OOP的核心思想是将现实世界中的事物抽象为程序中的"对象",每个对象包含数据(属性)和操作数据的方法(行为),从而更自然地模拟现实世界。这种思想革命性地改变了软件开发的方式,使得程序员能够以更直观、更符合人类思维习惯的方式来构建复杂系统。

Python作为一种现代高级编程语言,从设计之初就深度集成了面向对象特性。尽管Python支持多种编程范式(包括过程式和函数式),但面向对象编程无疑是Python最强大、最常用的编程方式之一。Python中的一切皆对象——数字、字符串、函数、模块,甚至是类本身都是对象,这种一致性设计使得面向对象编程在Python中显得尤为自然和强大。

🎗️面向对象编程的三大支柱

面向对象编程建立在三个基本概念之上:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
这三大特性相互关联、相互支撑,共同构成了面向对象编程的理论基础和实践框架。

​​封装​​是面向对象最基础也最重要的特性。它不仅仅是将数据和方法捆绑在一起的简单操作,更是一种信息隐藏的艺术。良好的封装在Python中表现为:通过命名约定区分公有和私有成员、使用属性装饰器控制对实例变量的访问、设计清晰的接口而隐藏实现细节。封装带来的直接好处是提高了代码的安全性和可维护性——对象内部状态的改变不会意外影响其他部分的代码,而实现细节的修改也不会影响对象的使用方式。

​​继承​​机制则体现了面向对象编程的另一个强大特性——代码复用和层次化抽象。在Python中,继承不仅限于简单的属性和方法继承,还包括方法重写、super()函数的使用、多重继承等高级特性。通过继承,我们可以建立从一般到特殊的类层次结构,避免代码重复,同时使系统结构更加清晰。Python的鸭子类型(duck typing)哲学虽然弱化了传统面向对象中继承的重要性,但合理的类继承设计仍然是构建可扩展系统的有力工具。

​​多态​​是面向对象编程中最富表现力的特性,它允许不同类的对象对同一消息做出不同的响应。在Python这样的动态类型语言中,多态的实现尤为灵活——不需要严格的类型继承关系,只要对象实现了相应的方法,它就可以在期望的上下文中使用。这种"接口而非继承"的多态实现方式,使得Python程序既保持了灵活性,又不失面向对象的优势。多态极大地提高了代码的通用性和可扩展性,是许多设计模式实现的基础。

🎁Python实现面向对象特性的独特之处

Python作为一门动态类型语言,在实现面向对象三大特性时展现出许多与众不同的特点,这些特点既带来了灵活性,也对程序员提出了更高的设计能力要求。

在封装方面,Python采用了一种"约定优于强制"的哲学。不同于Java或C++等语言的private关键字,Python通过单下划线()和双下划线(_)的命名约定来指示成员的访问权限。这种设计反映了Python的核心思想——“我们都是成年人了”,它信任程序员会遵循约定合理地访问对象内部,而不是通过语言机制强制限制。同时,Python的@property装饰器提供了优雅的属性访问控制方式,使得封装在Python中既灵活又实用。

继承机制在Python中的实现同样具有特色。Python支持多重继承,这为解决复杂问题提供了更多可能性,但也带来了著名的"菱形继承问题"。为此,Python采用了方法解析顺序(MRO)算法(特别是C3线性化算法)来确定方法查找顺序,这体现了Python在保持灵活性的同时也不乏严谨的设计理念。此外,Python中的抽象基类(ABC)和接口概念虽然不像Java那样严格,但通过标准库中的abc模块,Python同样能够实现接口规范和强制子类实现特定方法的功能。

多态在Python中的实现则更加"Pythonic"。由于Python采用鸭子类型——“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”,多态在Python中不依赖于严格的类型继承关系。这种设计使得Python代码更加灵活和富有表现力,但也要求程序员更加注重接口设计和文档规范。Python的协议(Protocol)概念(如迭代器协议、上下文管理器协议)正是这种灵活多态的体现,任何实现了iter方法的对象都可以被视为可迭代对象,而不需要显式声明实现某个接口。

🧧面向对象设计原则与Python实践

掌握面向对象三大特性只是成为优秀Python程序员的第一步。在实际开发中,我们需要将这些特性与面向对象设计原则结合起来,才能构建出真正健壮、灵活、可维护的系统。

🎑SOLID原则

SOLID原则是面向对象设计的五个基本原则,它们在Python中有着重要的实践意义:

  • ​​单一职责原则(SRP)​​:一个类应该只有一个引起变化的原因。在Python中,我们可以通过将大类拆分为多个小类,或使用组合而非继承的方式来遵循这一原则。
  • ​​开闭原则(OCP)​​:软件实体应该对扩展开放,对修改关闭。Python的动态特性使得通过组合、装饰器等方式扩展功能变得非常自然。
  • ​​里氏替换原则(LSP)​​:子类应该能够替换它们的父类而不影响程序正确性。在Python中,这要求我们在重写方法时保持行为的一致性,而不只是满足语法上的兼容。
  • ​​接口隔离原则(ISP)​​:客户端不应该被迫依赖它们不使用的接口。Python的抽象基类和协议机制可以帮助我们设计精炼的接口。
  • ​​依赖倒置原则(DIP)​​:高层模块不应该依赖低层模块,两者都应该依赖抽象。在Python中,我们可以通过依赖注入和面向接口编程来实现这一原则。

🎍注意点

此外,在Python中实践面向对象编程时,我们还需要特别注意以下几点:

  1. 优先使用组合而非继承:Python的动态特性使得组合通常比继承更加灵活和可维护。
  2. 合理利用魔法方法:Python通过__开头和结尾的特殊方法实现了许多面向对象的高级特性,熟练使用这些方法可以让我们的类更加"Pythonic"。
  3. 注意可哈希性和可变性:在设计类时,特别是当它们可能被用作字典键或存储在集合中时,需要特别注意hash和eq方法的实现。
  4. 利用数据类简化代码:Python 3.7引入的dataclasses模块可以大大简化主要用来存储数据的类的实现。

🎈本文内容概览

本文将深入探讨Python中面向对象编程的三大特性,从基础概念到高级应用,从语言特性到设计原则,全面剖析如何在Python中有效运用面向对象技术。具体内容包括:

  1. ​​封装的艺术​​:详细讲解Python中的封装机制,包括命名约定、属性控制、私有成员实现等,并通过实际案例展示良好封装如何提升代码质量。
  2. ​​继承的深度解析​​:系统介绍Python中的继承机制,包括方法解析顺序、super()函数的工作原理、抽象基类的使用等,并探讨何时使用继承、何时使用组合的决策方法。
  3. ​​多态的Python式实现​​:全面分析Python中实现多态的各种方式,包括继承多态、鸭子类型、协议和抽象基类等,并通过实际案例展示多态如何提高代码的灵活性。
  4. ​​三大特性的综合应用​​:通过一个完整的项目案例,展示如何将封装、继承和多态有机结合,构建可维护、可扩展的Python应用程序。
  5. ​​面向对象设计模式实践​​:介绍几个经典的面向对象设计模式(如策略模式、观察者模式、工厂模式)在Python中的实现,展示三大特性在实际设计中的应用。

通过本文的学习,读者不仅能够深入理解Python面向对象编程的三大特性,还能够掌握如何在实际项目中合理运用这些特性,编写出更加优雅、健壮的Python代码。无论是Python初学者还是有一定经验的开发者,都能从本文中获得有价值的见解和实践指导。

在这里插入图片描述

💡一、封装

⚽1.1.封装的目的

  1. 封装数据:保护隐私
  2. 封装方法:隔离复杂度(只保留部分接口对外使用)

⚾1.2.封装的方式

🎯1.2.1.公有属性和方法

公有属性和方法可以被类的外部访问和使用,不需要添加任何特殊符号。

class Student:"""Student类"""public_attribute = 'This is a public attribute'def __init__(self):self.public_student = "李华"def public_method(self):print("This is a public method.")student1=Student() # 创建对象
print(student1.public_attribute) # 输出:This is a public attribute
student1.public_method() # 输出:This is a public method.

公有属性和方法可以被类的外部访问和使用,不需要添加任何特殊符号。

🐵1.2.2.私有属性和方法

私有属性和方法的申明以双下划线开头(__):

封装属性: ​​__attr​​
封装方法:​​__func​​

在Python中,可以使用_和__来定义属性的访问级别。

  • 以_开头的属性被视为受保护的属性,即它们不应该在类外部被直接访问。但是,它们可以在类的子类和内部方法中被访问。

  • 以__开头的属性被视为私有属性,即它们不应该在类的外部被访问。但是,它们也可以在类的内部方法中被访问。

这里要提一下,对于python中受保护的属性,python是不会对其做任何处理的,比如我们看下面这个例子:

class Student:"""学生类"""def __init__(self,name,gender,age): # 构造方法self.name = name # 名字属性self._gender = gender # 性别属性self.__age = age # 年龄属性(私有属性,受保护)print(f"创建了一个学生对象#姓名:{self.name},性别:{self._gender},年龄:{self.__age}")student1 = Student("张三","男",18)
print(f"类外调用受保护属性:{student1._gender}") # 输出:类外调用受保护属性:男
student1._gender = "女" # 修改属性
print(f"修改后类外调用受保护属性:{student1._gender}")

但是按照python中的规则来讲,我们不能在类外部访问类内受保护的属性或方法。
还是这个例子,我们如果在类外访问私有属性,会发生什么呢?

class Student:"""学生类"""def __init__(self,name,gender,age): # 构造方法self.name = name # 名字属性self._gender = gender # 性别属性self.__age = age # 年龄属性(私有属性,受保护)print(f"创建了一个学生对象#姓名:{self.name},性别:{self._gender},年龄:{self.__age}"<
http://www.dtcms.com/a/341394.html

相关文章:

  • Jmeter接口测试
  • 30. 技术专题-锁
  • K8S-Configmap资源
  • 双模式 RTMP H.265 播放器解析:从国内扩展到 Enhanced RTMP 标准的演进
  • 媒体发稿平台哪家好?媒体新闻发稿渠道有哪些值得推荐?
  • 【知识杂记】陀螺仪直接积分就能获得角度吗?
  • 【C++】C++的类型转换
  • 《P1967 [NOIP 2013 提高组] 货车运输》
  • 多线程 + 事务传播误用导致的问题
  • 【北京迅为】iTOP-4412精英版使用手册-第三十二章 网络通信-TCP套字节
  • 如何排查服务器DNS解析失败的问题
  • TypeScript中的枚举
  • UE5分享序列播放器的停止与设置播放范围
  • 8.20作业
  • [Mysql数据库] 用户管理选择题
  • IIS访问报错:HTTP 错误 500.19 - Internal Server Error
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(一)基本代码
  • python的校园顺路代送系统
  • Seaweed-APT:AI视频生成模型,单步生成2秒钟的1280x720 24fps视频
  • 46.安卓逆向2-补环境-使用unidbg(使用apk文件补环境)
  • 面试记录5 .net
  • 电商大数据的采集过程详解​【采集内容|采集渠道|采集步骤|注意事项】
  • 算法第34天|动态规划:打家劫舍Ⅰ、打家劫舍Ⅱ、打家劫舍Ⅲ
  • 为了更强大的空间智能,如何将2D图像转换成完整、具有真实尺度和外观的3D场景?
  • (双类别检测:电动车 + 头部,再对头部分类)VS 单类别检测 + ROI 分类器 方案
  • 小迪安全v2023学习笔记(六十七讲)—— Java安全JNDI注入五大不安全组件RCE不出网
  • 2025年中高级后端开发Java岗八股文最新开源
  • 利用 PHP 爬虫获取店铺所有商品实战指南
  • Spring Boot 3.4.x 性能优化实战:用 Undertow 替换 Tomcat 全指南​
  • 自动驾驶汽车机器学习安全实用解决方案