Python中的面向对象编程

导读:本文旨在帮助读者从基础到高级逐步掌握Python的面向对象编程。

目录

OOP基础:构建块

类和对象

定义和实例化类

属性和方法

类属性和实例属性

继承

基本继承

深入理解OOP特性

封装

封装的概念

私有属性和方法

多态

多态性的好处

在Python中实现多态

抽象

抽象类和方法

OOP设计原则和模式

SOLID原则

单一职责原则(Single Responsibility Principle):

开放/封闭原则(Open/Closed Principle):

里氏替换原则(Liskov Substitution Principle):

接口隔离原则(Interface Segregation Principle):

依赖倒置原则(Dependency Inversion Principle):

设计模式

工厂模式(Factory Pattern):

单例模式(Singleton Pattern):

策略模式(Strategy Pattern):

最后


OOP基础:构建块

        在Python中,面向对象编程(OOP)是一种非常强大的编程范式,它允许开发者通过类和对象来组织代码,使代码更加模块化、灵活和可复用。本节将深入探讨OOP的基础:类和对象、属性和方法、以及继承。

类和对象

类是对象的蓝图,它定义了对象的结构和行为。对象是类的实例,它是具体的数据结构。

定义和实例化类

首先,我们来定义一个简单的类Dog,它代表狗这一类动物。然后我们将实例化一个Dog对象。

# 定义Dog类
class Dog:# 构造函数,每当创建新实例时调用def __init__(self, name, breed):# 属性定义self.name = name  # 名称self.breed = breed  # 品种# 方法定义def bark(self):# 狗叫的行为return f"{self.name} says woof!"# 实例化Dog对象
my_dog = Dog("Fido", "Labrador")
print(my_dog.bark())  # 输出: Fido says woof!

        在这个例子中,Dog类有两个属性:namebreed,以及一个方法:bark__init__方法是一个特殊的方法,被称为构造函数,在创建新实例时自动调用。

属性和方法

属性是附属于对象的数据,而方法是附属于对象的函数,可以操作对象的数据或执行与对象相关的任务。

类属性和实例属性

类属性是属于类的,被所有实例共享。实例属性只属于特定的实例

class Dog:# 类属性species = "Canine"def __init__(self, name, breed):# 实例属性self.name = nameself.breed = breed# 所有Dog对象将共享相同的species属性
print(Dog.species)  # 输出: Canine

 方法是定义在类中的函数,用于执行与对象相关的操作。

class Dog:def __init__(self, name, breed):self.name = nameself.breed = breed# 实例方法def describe(self):return f"{self.name} is a {self.breed}."my_dog = Dog("Fido", "Labrador")
print(my_dog.describe())  # 输出: Fido is a Labrador.

继承

        继承是OOP中一个强大的概念,它允许新的类(子类)继承另一个类(父类)的属性和方法,并可以添加或修改功能。

基本继承

创建一个Poodle类作为Dog类的子类,并继承其行为

class Poodle(Dog):def bark(self):# 重写父类方法return f"{self.name} says yap!"poodle = Poodle("Bella", "Poodle")
print(poodle.bark())  # 输出: Bella says yap!

        在这个例子中,Poodle继承了Dog的所有属性和方法,并重写了bark方法来反映贵宾犬不同的叫声。

深入理解OOP特性

        在掌握了面向对象编程的基本构建块之后,现在是时候深入理解OOP的核心特性了:封装、多态和抽象。这些特性是OOP强大功能的基础,能帮助我们编写出更加高效、可维护和可扩展的代码。

封装

        封装是OOP中的一个核心概念,它涉及将对象的数据(属性)和代码(方法)绑定到一起,并隐藏对象的内部实现细节。

封装的概念

  • 封装不仅仅是将数据和方法打包进类中,更重要的是提供访问这些数据和方法的接口,同时隐藏内部的复杂性和实现细节。

私有属性和方法

  • 在Python中,可以通过在属性或方法名前加上双下划线__来创建私有成员。这意味着它们不能从类的外部访问,只能通过类内部的方法进行访问和修改
class Account:def __init__(self, name, balance):self.name = nameself.__balance = balance  # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountself.__update_ledger(amount)def __update_ledger(self, amount):  # 私有方法print(f"{amount} added to the ledger.")account = Account("John", 1000)
account.deposit(500)
print(account.__balance)  # 这将引发错误,因为__balance是私有的

多态

        多态性是指不同类的对象可以对同一个方法调用做出响应。这意味着同一个方法或属性的调用可以有不同的行为,具体取决于对象的类型。

多态性的好处

  • 多态性允许程序员使用统一的接口来操作不同类型的对象,这使得代码更加灵活和可复用。

在Python中实现多态

  • 在Python中,多态是隐式的,因为它是一种动态类型的语言。你不需要特别的语法来实现多态,只需要确保对象具有所需的方法或属性。

来个例子,DogCat类都继承自Animal类,并重写了speak方法。animal_sound函数接受任何Animal类型的对象,并调用它的speak方法,展示了多态的使用。

class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def animal_sound(animal):print(animal.speak())animal_sound(Dog())
animal_sound(Cat())

抽象

        抽象是OOP中用来隐藏复杂性并显示关键信息的过程。它可以通过使用抽象类和方法来实现,这些类和方法定义了一个接口,但具体的实现细节留给了子类。

抽象类和方法

  • 抽象类是不能被实例化的类,它只能被继承。抽象方法是必须在子类中实现的方法。

在下面的例子中,Shape是一个抽象类,它定义了一个抽象方法areaRectangle类继承自Shape并提供了area方法的具体实现。

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.height# shape = Shape()  # 这将引发错误,因为Shape是一个抽象类
rect = Rectangle(10, 20)
print(rect.area())  # 输出: 200

OOP设计原则和模式

        理解并应用面向对象编程的设计原则和模式对于构建健壮、灵活且易于维护的应用程序至关重要。本节将探讨OOP的核心设计原则,即SOLID原则,以及一些在Python中常见的设计模式。

SOLID原则

SOLID原则是五个面向对象设计的基本原则,它们旨在促进更好的软件结构和可维护性。

单一职责原则(Single Responsibility Principle):

  • 定义: 一个类应该只有一个改变的理由。
  • 目的: 通过确保每个类都只关注单一任务,减少类的复杂度,提高可维护性。

开放/封闭原则(Open/Closed Principle):

  • 定义: 软件实体应该对扩展开放,对修改封闭。
  • 目的: 允许系统易于扩展而不需要修改现有代码,从而减少对现有功能的风险。

里氏替换原则(Liskov Substitution Principle):

  • 定义: 子类对象应该能够替换其父类对象被使用。
  • 目的: 保证继承体系的一致性,确保使用基类的地方同样适用子类。

接口隔离原则(Interface Segregation Principle):

  • 定义: 不应该强迫客户依赖于它们不使用的方法。
  • 目的: 创建专用的接口,而不是定义庞大的单一接口,减少依赖性,提高灵活性。

依赖倒置原则(Dependency Inversion Principle):

  • 定义: 高层模块不应依赖于低层模块,两者都应依赖于抽象。
  • 目的: 降低模块间的耦合度,提高系统的稳定性和灵活性。

设计模式

设计模式是针对常见问题的通用解决方案,它们在软件开发中广泛应用,我们简单介绍几个:

工厂模式(Factory Pattern):

  • 定义: 提供一个创建对象的接口,让子类决定实例化哪一个类。
  • 应用: 当你需要提供高层次的灵活性和可插拔性时,工厂模式非常有用。

单例模式(Singleton Pattern):

  • 定义: 确保一个类只有一个实例,并提供一个全局访问点。
  • 应用: 用于控制对某个资源的访问,如数据库连接或配置管理。

策略模式(Strategy Pattern):

  • 定义: 定义一系列算法,把它们一个个封装起来,并使它们可相互替换。
  • 应用: 当你有多种执行某个操作的方式时,策略模式允许在运行时选择最适合的方法。

最后

        经过对Python中面向对象编程(OOP)的深入探索,我们已经涵盖了从基本构建块到高级主题,再到设计原则和模式的广泛内容。通过这个过程,不仅加深了对OOP的理解,而且获得了实际应用这些概念以构建更强大、更可维护程序的能力。

--------------------

欢迎评论交流~ 欢迎点赞收藏~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 跨越配置

跨越配置1 项目框架 .NET Framework 1.web.config配置 在system.webServer节点中添httpProtocol子节点 Access-Control-Allow-Origin值为“*”” <httpProtocol><customHeaders><add name"Access-Control-Allow-Origin" value"*" /><…

鸿蒙ArkTS语言介绍与TS基础语法

1、ArkTS介绍 ArkTS是HarmonyOS主力应用开发语言&#xff0c;它在TS基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等响应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 JS 是一种属于网络的高级脚本语言&#xff0c;已经被广泛用…

Python: 函数参数是值传递还是引用传递

是引用传递。 Python的设计哲学是一切皆对象&#xff0c;不仅体现在内置数据类型、数据结构是对象&#xff0c;还包括Python编译运行需要的一些设施&#xff0c;比如stackframe、traceback等等。所以&#xff0c;为了更方便的传递数据&#xff0c;cpython内部全部采用指针传递…

共享类数据——class data share功能

CDS 前言定义创建归档文件创建基本归档文件使用归档文件注意事项 源码中体现 前言 现在系统原来越复杂&#xff0c;代码越来越多&#xff0c;启动程序需要加载大量的class文件&#xff0c;这样大量时间都耗在系统启动上。GraalVM原生镜像和Project CRaC都允许Spring Boot应用程…

用指针查找子串

本题要求实现一个字符串查找的简单函数。 函数接口定义&#xff1a; char *search( char *s, char *t ); 函数search在字符串s中查找子串t&#xff0c;返回子串t在s中的首地址。若未找到&#xff0c;则返回NULL。 裁判测试程序样例&#xff1a; #include <stdio.h> #…

React中也许你会用到的Context

文章概叙 本文主要是写React中Context的概念以及使用&#xff0c;请一定搞清楚什么时候使用Context Context的介绍 通常来说&#xff0c;你会通过 props 将信息从父组件传递到子组件。但是&#xff0c;如果你必须通过许多中间组件向下传递 props&#xff0c;或是在你应用中的…

OCC:第一个程序,对话框中显示一个BOX

1. OCC库的获取 从github上获取 gitgithub.com:tpaviot/oce.git&#xff0c;自己编译官网获取二进制包&#xff08;获取下来的只有release 版本的&#xff0c;而且VS版本不一定适合自己&#xff09;官网源码&#xff0c;然后自己编译&#xff08;稍微折腾点&#xff0c;建议按…

自动导入组件unplugin-auto-import和unplugin-vue-components

背景 当我们在Vue项目中使用第三方库或组件时&#xff0c;通常需要手动导入它们并在需要的地方进行注册。这可能会变得繁琐和冗长&#xff0c;特别是当我们使用大量的第三方库或组件时。为了简化这个过程&#xff0c;我们可以使用unplugin-auto-import和unplugin-vue-componen…

阻塞 IO(BIO)

文章目录 阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 阻塞 IO(BIO) 模型 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和链表项分别为等待队列头和…

java继承

访问权限 Java 中有三个访问权限修饰符: private、protected 以及 public&#xff0c;如果不加访问修饰符&#xff0c;表示包级可见。 可以对类或类中的成员(字段以及方法)加上访问修饰符。 类可见表示其它类可以用这个类创建实例对象。成员可见表示其它类可以用这个类的实例…

深入了解UI标签栏设计细节:你不能错过的要点

UI 标签栏的作用有哪些&#xff1f; 导航是移动 UI 中最常见的组成部分&#xff0c;通常放置在 UI 标签栏上&#xff0c;以帮助我们在不同的页面之间切换。UI 标签栏可以保持界面的可控性&#xff0c;并提高可用性。简而言之&#xff0c;UI 标签栏可以加强交互&#xff0c;让用…

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶&#xff0c;设置变量进阶&#xff0c;设置Token 前言 作为一个WEB工程师&#xff0c;在日常的使用过程中&#xff0c;HTTP请求是必不可少的。我们采用的HTTP工具有如下&#xff1a; Postman Insomnia Ap…

Java 多线程之并行流(parallelStream)

文章目录 一、概述二、使用方法2.1 parallelStream 使用2.2 Stream 方法介绍2.3 简单示例 三、应用示例3.1 示例介绍3.2 简单任务测试结果3.3 复杂任务测试结果3.4 结论 四、完整示例 一、概述 并行流是Java中Stream API的一部分&#xff0c;用于在多核处理器上并行执行流操作。…

综述 2022-Egyptian Informatics Journal:电子健康记录的安全和隐私

Keshta, Ismail, and Ammar Odeh. "Security and privacy of electronic health records: Concerns and challenges." Egyptian Informatics Journal 22.2 (2021): 177-183. https://doi.org/10.1016/j.eij.2020.07.003 被引次数&#xff1a;207 IF 5.2 / JCR Q2

CSS3多列分页属性

CSS3多列 Firefox浏览器支持该属性的形式是-moz-column-count&#xff0c;而基于Webkit的浏览器&#xff0c;例如Safari和Chrome&#xff0c;支持该属性的形式是-webkit-column-count column-count&#xff1a;该属性定义多列文本流中的栏数 语法&#xff1a;column-count:int…

YACS(上海计算机学会竞赛平台)三星级挑战——两数之和

题目描述 给定 n 个整数 a[1]​,a[2]​,⋯,a[n]​&#xff0c;并且保证 a[1​]≤a[2​]≤⋯≤a[n]​ 再给定一个目标值 t&#xff0c;请判断能否找到 a[i]​ 与 a[j]​&#xff0c;ai​aj​t 且 i≠j。 输入格式 第一行&#xff1a;单个整数n&#xff1b; 第二行&#xf…

智能优化算法应用:基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于卷尾猴算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷尾猴算法4.实验参数设定5.算法结果6.参考文…

C++ 函数重载、操作符重载

依然是温故而知新&#xff0c;不过现在更多的是以此为乐的心态啦。本篇通过代码实例&#xff0c;展示c函数重载相关知识&#xff0c;包括构造函数的重载、操作符重载等。 在构造函数重载中&#xff0c;给大家带来点稍微提升的用法&#xff0c; 看了不吃亏&#xff0c;看了不上当…

如何快速实现地源热泵远程监控

地源热泵远程监控解决方案 一、项目背景 山东省潍坊市盛世花园小区地源热泵项目是一个先进的供暖与制冷系统&#xff0c;旨在为整个小区提供高效且节能的温控服务。该系统主要由地下管道网络、地源热泵单元以及室内分配系统组成。 针对现有的地源热泵系统的管理和监控问题&a…

110基于matlab的混合方法组合的极限学习机和稀疏表示进行分类

基于matlab的混合方法组合的极限学习机和稀疏表示进行分类。通过将极限学习机&#xff08;ELM&#xff09;和稀疏表示&#xff08;SRC&#xff09;结合到统一框架中&#xff0c;混合分类器具有快速测试&#xff08;ELM的优点&#xff09;的优点&#xff0c;且显示出显着的分类精…