Python继承技法揭示,代码更具扩展性

865193c04c0ffb0cc90816d21deea84c.jpeg

更多Python学习内容:ipengtao.com

大家好,我是彭涛,今天为大家分享 Python继承技法揭示,代码更具扩展性,全文4000字,阅读大约11分钟。

继承是面向对象编程中的核心概念之一,它允许创建一个新的类,从而继承现有类的属性和方法。Python作为一门面向对象的编程语言,强大而灵活的继承机制为构建高效、可维护的代码提供了便利。本篇博客将深入讲解Python中的继承,提供详细而全面的内容,以及丰富的示例代码,帮助大家掌握这一强大的编程工具。

1. 类与对象回顾

在深入讨论继承之前,回顾一下类与对象的基础知识。类是一种数据类型,对象是类的实例。通过类,可以定义属性和方法,用于描述对象的状态和行为。

class Animal:def __init__(self, name):self.name = namedef speak(self):pass  # Abstract methodclass Dog(Animal):def speak(self):return f"{self.name} says Woof!"class Cat(Animal):def speak(self):return f"{self.name} says Meow!"dog = Dog("Buddy")
cat = Cat("Whiskers")print(dog.speak())  # Output: Buddy says Woof!
print(cat.speak())  # Output: Whiskers says Meow!

在上述例子中,Animal是一个基类,DogCat是派生类。基类定义了一个抽象方法speak,而派生类通过继承并实现这一方法,使得每个类可以有自己的'speak'行为。

2. 单继承与多继承

Python支持单继承和多继承。单继承是指一个类只能继承自一个基类,而多继承则是指一个类可以同时继承自多个基类。

下面是一个简单的多继承示例:

class A:def method(self):return "A method"class B:def method(self):return "B method"class C(A, B):passobj = C()
print(obj.method())  # Output: A method

在多继承中,如果有相同方法名的情况,Python会按照类的顺序从左到右查找,即C类会先查找A类的方法。

3. 方法的重写

继承允许派生类重写基类中的方法,以满足子类的需求。这种机制称为方法的重写。

以下是一个简单的例子:

class Shape:def area(self):return 0class Square(Shape):def __init__(self, side_length):self.side_length = side_lengthdef area(self):return self.side_length ** 2square = Square(5)
print(square.area())  # Output: 25

在这个例子中,Square类继承自Shape类,并重写了area方法,使得Square类的实例能够计算正方形的面积。

4. 调用基类方法

有时候,在派生类的方法中想要调用基类的方法,可以使用super()函数。

以下是一个使用super()的示例:

class Parent:def method(self):print("Parent method")class Child(Parent):def method(self):super().method()print("Child method")child = Child()
child.method()

在这个例子中,Child类继承自Parent类,并使用super().method()调用了基类的方法。这种方式有助于保留基类的功能并在其基础上进行扩展。

5. 抽象基类与接口

Python通过ABC模块提供了抽象基类(Abstract Base Class)的支持,可以用于定义抽象方法。抽象方法是在基类中声明但在派生类中必须实现的方法。

以下是一个抽象基类的例子:

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Square(Shape):def __init__(self, side_length):self.side_length = side_lengthdef area(self):return self.side_length ** 2square = Square(5)
print(square.area())  # Output: 25

在这个例子中,Shape类是抽象基类,其中的area方法是抽象方法,必须在派生类中实现。

6. 多态性与动态绑定

继承不仅仅是属性和方法的继承,还引入了多态性的概念。多态性允许不同的类使用相同的方法名,但实现方式可能不同。这种灵活性使得代码更易扩展和维护。

以下是一个简单的多态性示例:

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):return animal.speak()dog = Dog()
cat = Cat()print(animal_sound(dog))  # Output: Woof!
print(animal_sound(cat))  # Output: Meow!

在这个例子中,animal_sound函数接受一个Animal对象,无论传入的是Dog还是Cat,都能正确地调用各自的speak方法。

7. Mixin 类

Mixin是一种通过多继承来增加类功能的方式。Mixin类通常不会独立存在,而是与其他类组合使用。

以下是一个简单的Mixin示例:

class JSONMixin:def to_json(self):import jsonreturn json.dumps(self.__dict__)class Person:def __init__(self, name, age):self.name = nameself.age = ageclass JSONPerson(Person, JSONMixin):passperson = JSONPerson("Alice", 30)
print(person.to_json())  # Output: {"name": "Alice", "age": 30}

在这个例子中,JSONMixin提供了to_json方法,通过多继承,JSONPerson类同时拥有Person类和JSONMixin类的功能。

8. 类属性与实例属性

在继承中,类属性是共享的,而实例属性是独立的。修改类属性会影响所有实例,而修改实例属性只影响该实例。

以下是一个简单的例子:

class Vehicle:class_name = "Vehicle"def __init__(self, name):self.name = namecar1 = Vehicle("Car1")
car2 = Vehicle("Car2")print(car1.class_name)  # Output: Vehicle
print(car2.class_name)  # Output: VehicleVehicle.class_name = "Transport"print(car1.class_name)  # Output: Transport
print(car2.class_name)  # Output: Transportcar1.class_name = "Car"print(car1.class_name)  # Output: Car
print(car2.class_name)  # Output: Transport

在这个例子中,class_name是类属性,通过修改Vehicle.class_name会影响所有实例,但当为car1单独设置car1.class_name = "Car"时,它成为了一个实例属性,不再受到类属性的影响。

总结

在本篇文章中,深入研究了Python中的继承机制,从基础概念、多继承与单继承,到方法的重写、调用基类方法,再到多态性与动态绑定、Mixin类的应用,以及类属性与实例属性的区别等多个方面进行了详细阐述。通过深刻理解这些概念和技巧,大家能够在项目中更好地设计和组织代码,构建出灵活而高效的类层次结构。

继承使得代码具备了可扩展性和可维护性,通过合理设计基类与派生类,能够避免重复代码,提高代码的复用性。多态性的引入使得不同类对象能够共享相同的方法名,从而实现更为灵活的编程。Mixin类作为一种组合类的方式,提供了一种结构清晰的扩展方案。然而,为了保持代码的清晰性,也强调了一些最佳实践,如避免过度使用多继承、充分利用抽象基类等。这些实践有助于确保代码的可读性、可维护性,并降低了代码结构的复杂度。

继承是Python中面向对象编程的核心,通过学习和应用这些继承的概念,能够构建出更为强大、清晰、可维护的代码世界。希望本文提供的深入解析和丰富示例代码,有助于大家更好地理解和应用Python中的继承机制,提升编程技能和代码设计水平。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

773996a0d471b57dee5d314a9bab517d.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

spring 框架的 AOP

AOP依赖导入 <!-- AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

如何购买华为云服务器

华为云是华为推出的云计算服务平台&#xff0c;旨在为企业和个人提供全面的云端解决方案。它提供了包括计算、存储、数据库、人工智能、大数据、安全等多种云服务&#xff0c;覆盖了基础设施、平台和软件级别的需求。华为云致力于构建安全可信赖的云计算基础设施&#xff0c;以…

智慧校园:TSINGSEE青犀智能视频监控系统,AI助力优化校园管理

随着科技的飞速发展和信息化社会的到来&#xff0c;智慧校园已经成为教育领域的一种新型发展模式。智慧校园的需求和发展趋势日益显现&#xff0c;其建设已成为当今教育信息化发展的重要方向。 TSINGSEE青犀结合高可靠、高性能的云计算、人工智能、大数据、物联网等技术&#…

【QT】Qt常用数值输入和显示控件

目录 1.QAbstractslider 1.1主要属性 2.QSlider 2.1专有属性 2.2 常用函数 3.QScrollBar 4.QProgressBar 5.QDial 6.QLCDNumber 7.上述控件应用示例 1.QAbstractslider 1.1主要属性 QSlider、QScrollBar和Qdial3个组件都从QAbstractSlider继承而来&#xff0c;有一些共有的属性…

三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)

说明&#xff1a;当前调试仅仅用来测试和熟悉部分摄像头寄存器模式 一、图片成像方向控制&#xff0c;基本每个摄像头都会有上下左右翻转寄存器 正向图片 反向图片 二、设置成像数据成各种颜色&#xff0c;&#xff08;黑白/原彩/黄色等等&#xff09; 在寄存器书册描述中…

【面试经典150 | 二叉树】相同的树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

10.机器人系统仿真(urdf集成gazebo、rviz)

目录 1 机器人系统仿真的必要性与本篇学习目的 1.1 机器人系统仿真的必要性 1.2 一些概念 URDF是 Unified Robot Description Format 的首字母缩写&#xff0c;直译为统一(标准化)机器人描述格式&#xff0c;可以以一种 XML 的方式描述机器人的部分结构&#xff0c;比如底盘…

C++ 预处理详解

目录 预处理符号 #define #define定义标识符 #define定义宏 #define的替换规则 #与## 带副作用的宏参数 宏和函数的对比 undef 命令行定义 条件编译 文件包含 头文件被包含的方式 本地文件包含 库文件包含 嵌套文件包含 预处理符号 __FILE__ //进行编译的源…

【电路笔记】-电阻器额定功率

电阻器额定功率 文章目录 电阻器额定功率1、概述2、电阻功率&#xff08;P&#xff09;3、功率电阻器4、电阻器额定功率示例15、电阻器额定功率示例2 电能被电阻吸收&#xff0c;因为它是电压和电流的乘积&#xff0c;一些电阻将这种电能转化为热量。 1、概述 当电流由于电阻器…

flex 布局防止元素被挤换行

刚开始是这样的代码&#xff1a; <div class"flex"><span>选择模型&#xff1a;</span><n-select :options"state.chatModelOptions" /> </div>选择模型换行了…不行&#xff0c;这个效果不行&#xff0c;修改后&#xff1…

windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行

目录 1、jar文件简述2、问题来源3、操作步骤3.1 解压jar包3.2 替换或者更改操作3.3 重新打成jar包3.4 确认是否修改成功3.5 运行程序 附录&#xff1a;常见命令参数 1、jar文件简述 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的…

哈希表【2】

文章目录 &#x1f348;217. 存在重复元素&#x1f34c;1. 题目&#x1f34f;2. 算法原理&#x1f353;3. 代码实现 &#x1f383;219. 存在重复元素 II&#x1f384;题目&#x1f386;算法原理&#x1f9e8;代码实现 &#x1f348;217. 存在重复元素 &#x1f34c;1. 题目 题…

JFrog----基于Docker方式部署JFrog

文章目录 1 下载镜像2 创建数据挂载目录3 启动 JFrog服务4 浏览器登录5 重置密码6 设置 license7 设置 Base URL8 设置代理9 选择仓库类型10 预览11 查看结果 1 下载镜像 免费版 docker pull docker.bintray.io/jfrog/artifactory-oss体验版&#xff1a; docker pull releas…

LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

禅道v11.6 基于linux环境下的docker容器搭建的靶场

一、环境搭建 linux环境下的 在docker环境下安装禅道CMS V11.6 docker run --name zentao_v11.6 -p 8084:80 -v /u01/zentao/www:/app/zentaopms -v /u01/zentao/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -d docker.io/yunwisdom/zentao:v11.6二、常见问题 1.删除…

Swing程序设计详解(二)

一 文件标签组与图标 在Swing程序设计中&#xff0c;标签(JLabel)被用于显示文本、图标等内容。在Swing应用程序的用户系面中&#xff0c;用户能够通过标签上的文本、图标等内容获得相应的提示信息。 1.1 JLable标签 标签(JLabel)的父类是JComponent类。虽然标签不能被添加…

Canal笔记:安装与整合Springboot模式Mysql同步Redis

官方文档 https://github.com/alibaba/canal 使用场景 学习一件东西前&#xff0c;要知道为什么使用它。 1、同步mysql数据到redis 常规情况下&#xff0c;产生数据的方法可能有很多地方&#xff0c;那么就需要在多个地方中&#xff0c;都去做mysql数据同步到redis的处理&…

在微信小程序中如何改变默认打开的页面

在微信小程序中&#xff0c;在我们编写页面的时候&#xff0c;可能会在重新渲染的时候导致页面跳转到默认打开的页面上&#xff0c;为了提升用户的一个体验&#xff0c;我们可以设置一些内容来修改小程序默认打开的页面&#xff0c;提升开发者的开发体验。 当我们打开一个微信…

nodejs微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

某60区块链安全之JOP实战二学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战二实验目的掌握对EVM逆向能力实验环境实验工具实验原理实验内容Jump Oriented Programming实战二 实验步骤Jump Oriented Programming实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Jum…