Python基础(二十八、多态、抽象类)

文章目录

  • 一、什么是多态?
  • 二、多态的实现
    • 1.通过继承实现多态
    • 2.抽象类实现多态
      • 2.1 抽象类的实现
      • 2.2 抽象类的注意事项
      • 2.3 总结
  • 三、注意事项
  • 四、总结
    • 随笔练习抽象类

在面向对象编程中,多态是一种强大的概念,它允许不同类型的对象对相同的消息做出不同的响应。Python作为一门支持面向对象编程的语言,也支持多态。

一、什么是多态?

多态(Polymorphism)是指在面向对象编程中,不同类型的对象可以使用相同的接口,而具体的实现方式则各不相同。
换句话说,当我们调用一个方法时,不同的对象可以以不同的方式来响应这个方法调用。
这种极大地提高了代码的可复用性和可扩展性。
多态即是面向对象编程的三大特性之一,另外两个是封装和继承。

二、多态的实现

Python通过动态类型语言的特点来实现多态,即在运行时根据实际对象的类型进行方法调用。具体来说,Python中的多态实现依赖于以下两个特性:

  • 动态绑定(Dynamic Binding):在运行时根据对象的类型确定方法的具体实现;
  • 鸭子类型(Duck Typing):只要一个对象“走起路来像鸭子、叫起来像鸭子”,那么它就可以被视为鸭子。

1.通过继承实现多态

下面通过一个例子来说明Python中的多态实现:

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError('Subclass must implement abstract method')class Dog(Animal):def speak(self):return 'Woof!'class Cat(Animal):def speak(self):return 'Meow!'def animal_speak(animal):print(animal.speak())dog = Dog('Tommy')
cat = Cat('Kitty')animal_speak(dog)  # 输出:Woof!
animal_speak(cat)  # 输出:Meow!

在上面的例子中,我们定义了一个Animal类和两个子类Dog和Cat,它们分别实现了speak()方法。
animal_speak()函数接受任何一个Animal对象,并调用其speak()方法。
由于Python是动态类型语言,因此在运行时可以根据实际传入的对象类型确定调用哪个speak()方法。

2.抽象类实现多态

抽象类是一种只能被继承而不能被实例化的类。它定义了一个通用的接口,子类必须实现这个接口中定义的方法或属性。抽象类的存在可以让我们在设计和编写代码时更加灵活和规范。抽象类的主要作用有两个:

  • 提供一种规范:抽象类定义了子类应该具备的方法或属性,确保了子类的一致性。
  • 强制子类实现:抽象类要求子类必须实现抽象类中定义的方法或属性,否则会在运行时抛出异常。

2.1 抽象类的实现

Python中的抽象类通过abc模块来实现。该模块提供了ABC(Abstract Base Class)类和abstractmethod装饰器,用于定义抽象类和抽象方法。
语法:

from abc import ABC, abstractmethodclass 类名(ABC):@abstractmethoddef 函数名(self):pass或者逻辑

下面是一个简单的示例:

from abc import ABC, abstractmethodclass AbstractClassExample(ABC):@abstractmethoddef method1(self):pass@abstractmethoddef method2(self):passclass ConcreteClassExample(AbstractClassExample):def method1(self):print("Method 1 implementation")def method2(self):print("Method 2 implementation")# 抽象类无法实例化
# example = AbstractClassExample()# 子类可以实例化并调用方法
example = ConcreteClassExample()
example.method1()  # 输出:"Method 1 implementation"
example.method2()  # 输出:"Method 2 implementation"

在上面的示例中,AbstractClassExample是一个抽象类,它继承自ABC类。method1()和method2()被abstractmethod装饰器修饰,表示它们是抽象方法,子类必须实现这两个方法。

ConcreteClassExample是一个具体类,它继承自AbstractClassExample。
由于ConcreteClassExample重写了method1()和method2(),因此它可以实例化并调用这两个方法。

2.2 抽象类的注意事项

在使用抽象类时,需要注意以下几点:

  • 抽象类不能被实例化:抽象类只能用作其他类的基类,不能直接创建实例。
  • 子类必须实现所有抽象方法:子类必须实现抽象类中定义的所有抽象方法,否则会在运行时抛出异常。如果子类没有实现所有抽象方法,它也会被视为抽象类。
  • 抽象方法可以有实现:抽象方法可以在抽象类中有默认实现,但子类仍然可以选择重写这些方法。
  • 抽象类可以包含非抽象方法:抽象类中除了抽象方法外,还可以包含普通的方法和属性。

2.3 总结

抽象类是一种不能被实例化的类,它定义了其他类的通用接口和行为。Python通过abc模块来实现抽象类,使用ABC类作为基类和abstractmethod装饰器来定义抽象类和抽象方法。使用抽象类可以提供代码的规范性和灵活性,强制子类实现抽象方法,从而提高代码的可靠性和可维护性。然而,在使用抽象类时,需要注意抽象类不能被实例化、子类必须实现所有抽象方法等事项。

三、注意事项

虽然多态可以提高代码的可复用性和可扩展性,但也需要注意一些问题。

  • 抽象基类应该定义规范的接口,确保所有实现该接口的子类都能够正确地响应相应的方法调用。
  • 尽管Python是一门动态类型语言,但仍然需要注意调用的方法是否存在,以避免在运行时抛出AttributeError异常。
  • 当有多个子类实现了同一个方法时,需要确保每个子类的实现方式是相互独立的,以避免意外地影响其他子类的正确性。

四、总结

多态是面向对象编程中非常重要的一个概念,它可以提高代码的可复用性和可扩展性。
Python作为一门支持面向对象编程的语言,通过动态类型语言的特点来实现多态,即在运行时根据实际对象的类型进行方法调用。同时,我们也需要注意抽象基类的规范定义、方法调用的存在性以及子类实现方式相互独立等问题。

随笔练习抽象类

from abc import ABC,abstractmethod"""
1.需要使用abc模块实现抽象类,即定义抽象类的时候需要class 抽象类名称(ABC):
2.实现抽象类,要将抽象方法都实现
3.抽象类不能被实例化,会报错TypeError: Can't instantiate abstract class Animal with abstract methods cood, speak
4.抽象类中可以有构造函数,可以有普通函数
5.抽象方法可以有实现
"""
class Animal(ABC):def __init__(self,type):self.type = typedef speak(self):print("要吃冻干")@abstractmethoddef speak(self):pass# 抽象方法可以有实现@abstractmethoddef cood(self):print("要吃冻干")class Cat(Animal):color = Nonedef speak(self):print("要吃冻干")def cood(self):print("要吃冻干")cat = Cat("1")
cat.speak()

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

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

相关文章

C++学习笔记(三十六):c++ 线程

本节主要学习c线程。线程的简单代码示例 #include <iostream> #include <thread> static bool s_Finished false;void Work() {using namespace std::literals::chrono_literals;std::cout << std::this_thread::get_id() << std::endl;while (!s_Fin…

代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…

记录一个Insert姿势引起的MySQL从库上查不到数据的问题

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 某测试环境的MySQL用了两台节点&#xff0c;主从同步结构。忽然有研发同学反映说MySQL的主从不同步了。他…

大数据技术原理与应用期末复习(林子雨)

大数据技术原理与应用期末复习&#xff08;林子雨&#xff09; Hadoop的特性HBase编程实践NoSQL的四大类型键值数据库优点&#xff1a;缺点&#xff1a; 列族数据库优点&#xff1a;缺点&#xff1a; 文档数据库优点&#xff1a;缺点&#xff1a; 图数据库优点&#xff1a;缺点…

《设计模式的艺术》笔记 - 工厂方法模式

介绍 在简单工厂模式中&#xff0c;当系统中需要引入新的产品时&#xff0c;由于静态工厂方法通过所传入的参数的不同来创建不同的产品&#xff0c;这必定要修改工厂类的源代码&#xff0c;将违背开闭原则。因此&#xff0c;工厂方法模式应运而生。工厂方法模式是定义一个用于创…

超声波眼镜清洗机清洗眼镜会有伤害吗?适合洗眼镜超声波清洗机

眼镜作为日常生活中不可或缺的辅助视力工具&#xff0c;经常需要清洁保养以确保视力清晰和舒适佩戴。随着科技的发展&#xff0c;超声波眼镜清洗机成为越来越受欢迎的清洁方式。然而&#xff0c;很多人可能会担心使用超声波清洗机是否会对眼镜造成损害。但是可以很可以的告诉大…

【CMake报错解决】解决ITK和VTK版本不对应问题

ITKVTKGlue编译报错&#xff1a; CMake Error at C:/…/ITK/debug/lib/cmake/ITK-4.13/Modules/ITKVtkGlue.cmake:37 (vtk_module_config): Unknown CMake command “vtk_module_config”. 原因&#xff1a;ITK和VTK版本不对应导致找不到vtk_module_config文件&#xff0c;编译…

设计模式——原型模式(Prototype Pattern)

概述 原型模式(Prototype Pattern)&#xff1a;使用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式的工作原理很简单&#xff1a;将一个原型对象传给那个要发动创建的对象&#xff0c;这个要发动创建的对象…

C1-3.4 多个样本的向量化

C1-3.4 多个样本的向量化 1、为什么要用样本的向量化呢&#xff1f; 总结一句话&#xff1a;计算方便 下图是神经网络计算的步骤&#xff0c;右侧 是有一个输入变量a[0]&#xff08;什么是X呢&#xff0c;因为输入层有三个神经元&#xff0c;说明有三个输入变量&#xff0c;…

15 个适用于 Windows 的 PDF 解锁工具大全

PDF&#xff08;便携式文件格式&#xff09;是一种文件格式&#xff0c;用于呈现和交换任何独立于任何软件、硬件或操作系统的可靠访问的文档。Adobe 发明了它&#xff0c;但现在它是由国际标准化组织 (ISO) 维护的开放标准。因此&#xff0c;您现在必须了解这些 PDF 解锁工具。…

Spring Boot项目中校验器的使用与注意事项

Spring Boot项目中校验器的使用与注意事项 Spring Boot为开发者提供了强大而灵活的校验机制&#xff0c;通过使用校验器&#xff08;Validator&#xff09;&#xff0c;我们能够在应用程序中方便地进行数据验证和错误处理。本文将深入介绍Spring Boot中校验器的使用方法&#…

go如何终止多个for select循环嵌套

空山新雨后&#xff0c;天气晚来秋。 目录 分类说明 总结 分类说明 for select循环嵌套&#xff0c;如何终止&#xff1f;上代码&#xff1a; stop : make(chan struct{})go func() {for i : 1; i < 3; i {fmt.Println("writed ", i)time.Sleep(time.Second * …

「HDLBits题解」Alwaysblock2

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Alwaysblock2 - HDLBits // synthesis verilog_input_version verilog_2001 module top_module(input clk,input a,input b,output…

phpcms v9外链文章获取点击量

默认phpcms v9的外链文章因为直接跳转&#xff08;不进入详情页模板&#xff09;&#xff0c;导致外链文章的点击量一直是0&#xff0c;而我们有时需要按点击量排行或者排序的时候&#xff0c;就有问题了。 这里我们借助系统自带的点击量接口api来获取&#xff1a; 一、前台JS…

【随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络&#xff08;Backpropagation Neural Network&#xff0c;反向传播神经网络&#xff09;是一种监…

Linux第21步_取消鼠标中键的复制粘贴功能

在ubuntu18.04操作系统中&#xff0c;选中文本后&#xff0c;若按下鼠标中键&#xff0c;就可以执行复制粘贴&#xff0c;相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中&#xff0c;基本上都是这么配置的。在windows系统中&#xff0c;我们习惯用Ctrl-C复制&#xff0…

普通人想通过抖音赚钱要先知道这4点

1.变现方式 想做抖音首先要想好变现路径以及通过什么方式变现。做抖音就是在经营某一类人群&#xff0c;因为人群绑定了精准标签&#xff0c;系统推送的精准又绑定了变现。所以要明确你经营的目标人群是谁&#xff0c;你在做谁的生意&#xff0c;你要赚谁的钱。他们的年龄、收…

OpenCV-Python的版本介绍及区别

OpenCV-Python版本介绍 OpenCV-Python有多个版本&#xff0c;每个版本都有其特定的功能和改进。以下是一些常见OpenCV-Python版本及其介绍和区别&#xff1a; OpenCV-Python 2.x版本 这是OpenCV-Python的旧版本&#xff0c;支持Python 2.x。它包含了许多传统的计算机视觉功能&…

可盐可甜的红色马甲背心

膨体棉腈面料不易皱&#xff0c;搭配阿兰花菱形镂空设计 真的绝绝子&#xff0c;红色吸睛又美观 随便搭配一件衬衫去穿&#xff0c;自带文艺气息 氛围感直接拉满 出街拍照很出片&#xff0c;时髦又气质 女孩子的甜美&#xff0c;温柔等都可以突显 有喜欢的可以尝试一下哟…

超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放

引言&#xff1a;基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下&#xff1a; 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令&#xff0c;作出运动控制 4、设置…