首页 > 编程语言 >Python面向对象编程:继承和多态③

Python面向对象编程:继承和多态③

时间:2024-10-14 11:46:43浏览次数:3  
标签:__ Python 子类 self py 多态 面向对象编程 def

在这里插入图片描述

文章目录

Python是一门强大的面向对象编程语言,它支持许多面向对象编程的特性,其中最重要的两个概念就是继承和多态。继承允许我们基于现有的类创建新类,从而实现代码重用和层次化设计;多态则允许对象以多种形式表现,使代码更加灵活和可扩展。

本文将详细介绍Python中的继承和多态,并通过一个综合详细的例子来展示它们的实际应用。

一、继承

1.1 什么是继承

继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码重用和层次化设计。通过继承,子类不仅可以拥有父类的所有属性和方法,还可以添加自己的属性和方法,甚至重写父类的方法。

1.2 定义父类和子类

在Python中,定义父类和子类非常简单。子类通过括号中的父类名称来继承父类:

class Parent:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, my name is {self.name}."

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)  # 调用父类的构造方法
        self.age = age

    def introduce(self):
        return f"I am {self.age} years old."

在上面的例子中,Child类继承了Parent类,并添加了一个新的属性age和一个新的方法introduce

1.3 子类重写父类的方法

子类可以重写父类的方法,以提供新的实现:

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."

在上面的例子中,Child类重写了Parent类的greet方法。

1.4 多继承

Python还支持多继承,即一个类可以继承多个父类:

class Parent1:
    def method1(self):
        return "Method from Parent1"

class Parent2:
    def method2(self):
        return "Method from Parent2"

class Child(Parent1, Parent2):
    pass

在上面的例子中,Child类同时继承了Parent1Parent2类,拥有这两个类的所有方法。

二、多态

2.1 什么是多态

多态是指不同类的对象可以通过相同的接口调用,而具体的实现则依赖于对象所属的类。多态使得代码更加灵活和可扩展,能够处理不同类型的对象。

2.2 多态的实现

多态的实现通常依赖于继承和方法重写。在Python中,可以通过定义父类和子类,并在子类中重写父类的方法来实现多态:

class Animal:
    def 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 make_animal_speak(animal):
    print(animal.speak())

在上面的例子中,Animal是一个父类,DogCat是子类,它们都实现了speak方法。make_animal_speak函数可以接受任何Animal类的对象,并调用其speak方法。

2.3 抽象类和接口

在实际应用中,我们常常使用抽象类和接口来实现多态。抽象类是不能实例化的类,它通常包含抽象方法,子类必须实现这些方法。Python中的抽象类可以使用abc模块来定义:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

在上面的例子中,Animal是一个抽象类,包含一个抽象方法speak。子类DogCat必须实现speak方法。

三、综合详细例子

下面是一个综合详细的例子,展示如何使用继承和多态实现一个简单的图形绘制系统。

3.1 项目结构

shapes/
    __init__.py
    shape.py
    circle.py
    rectangle.py
main.py

3.2 模块代码

init.py

__init__.py 文件用于将 shapes 目录标识为一个包。在这个例子中,__init__.py 文件可以是空的,或者可以用于导入包中的所有模块。

shapes/init.py

from .shape import Shape
from .circle import Circle
from .rectangle import Rectangle

__all__ = ["Shape", "Circle", "Rectangle"]
shape.py
# shapes/shape.py

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

    @abstractmethod
    def area(self):
        pass
circle.py
# shapes/circle.py

import math
from .shape.py import Shape

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        return f"Drawing a circle with radius {self.radius}"

    def area(self):
        return math.pi * self.radius ** 2

    def __str__(self):
        return f"Circle(radius={self.radius})"
rectangle.py
# shapes/rectangle.py

from .shape import Shape

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def draw(self):
        return f"Drawing a rectangle with width {self.width} and height {self.height}"

    def area(self):
        return self.width * self.height

    def __str__(self):
        return f"Rectangle(width={self.width}, height={self.height})"

3.3 主程序代码

main.py
# main.py

from shapes.circle import Circle
from shapes.rectangle import Rectangle

def main():
    shapes = [
        Circle(5),
        Rectangle(3, 4),
        Circle(10)
    ]

    for shape in shapes:
        print(shape.draw())
        print(f"Area: {shape.area()}")
        print()

if __name__ == "__main__":
    main()

3.4 运行结果

Drawing a circle with radius 5
Area: 78.53981633974483

Drawing a rectangle with width 3 and height 4
Area: 12

Drawing a circle with radius 10
Area: 314.1592653589793

四、总结

本文详细介绍了Python面向对象编程中的继承和多态,包括继承的定义、子类的创建和重写、多继承的实现、多态的概念和实现、抽象类和接口等。通过综合详细的例子展示了如何在实际项目中应用这些概念。希望本文对你理解和掌握Python面向对象编程中的继承和多态有所帮助。


欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

标签:__,Python,子类,self,py,多态,面向对象编程,def
From: https://blog.csdn.net/rjdeng/article/details/142914819

相关文章

  • 查找大量时序遥感文件缺失、不连贯的成像日期:Python代码
      本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计、列出未下载影像所对应的时相的方法。  批量下载大量遥感影像文件对于RS学生与从业人员可谓十分常见。在我们之前的文章中,就介......
  • Python 中快速上手机器学习的基础算法
    机器学习作为一种让计算机从数据中自动学习的技术,在近年来得到了迅猛发展。本文将介绍几种基础的机器学习算法,并通过Python代码示例展示它们的应用。1.什么是机器学习机器学习是一种让计算机学会从数据中自动“学习”并做出预测或决策的技术。不需要显式地编程告诉计算机......
  • python 实现凸多边形的凸包问题算法
    凸多边形的凸包问题算法介绍凸多边形的凸包问题本身有点自相矛盾,因为凸多边形本身就是其所有顶点的凸包。凸包(ConvexHull)的定义是对于一个点集,包含所有点的最小凸多边形。对于已经是凸多边形的点集,这个多边形就是它自己的凸包。然而,如果你的问题是关于如何找到一个点集的......
  • 【Python开发技术之PyQt5精品教学】第36课--PyQt5 拖放功能
    PyQt5拖放功能拖放功能对用户来说非常直观。它被应用于许多桌面应用程序,用户可以将对象从一个窗口复制或移动到另一个窗口。基于MIME的拖放数据传输是基于QDrag类实现的。QMimeData对象将数据与对应的MIME类型关联起来。数据被存储在剪贴板中,然后在拖放过程中使用。以下QMi......
  • 【Python开发技术之PyQt5精品教学】第32课--PyQt5 QDialog类
    PyQt5QDialog类QDialog 是一个顶层窗口小部件,主要用于收集用户的响应。它可以配置为 模态 (它会阻塞其父窗口)或 非模态 (对话框窗口可以被绕过)。PyQt API有许多预配置的对话框小部件,例如InputDialog,FileDialog,FontDialog等。示例在下面的示例中,对话框窗口的 WindowMo......
  • 【Python开发技术之PyQt5精品教学】第24课--PyQt5 QTab小部件
    PyQt5QTab小部件如果一个表单具有太多字段无法同时显示,则可以将它们安排在选项卡窗口小部件的每个选项卡下的不同页面中。提供了一个选项卡栏和一个页面区域。第一个选项卡下的页面会显示,其他页面会隐藏。用户可以通过点击所需的选项卡来查看任何页面。以下是QTabWidget类的......
  • 【Python开发技术之PyQt5精品教学】第31课--PyQt5 QCalendar小工具
    PyQt5QCalendar小工具QCalendar小工具是一个有用的日期选择器控件。它提供了基于月份的视图。用户可以通过鼠标或键盘选择日期,默认为今天的日期。还可以指定日历的日期范围。以下是这个类的一些实用方法:序号方法和描述1setDateRange() :设置可选择的较低和较高日期。2setFi......
  • 烟尘监测识别系统 Python
    烟尘监测识别系统基于先进的AI机器视觉技术,烟尘监测识别系统通过现场已有的监控摄像头对可能发生露天焚烧的重点区域进行实时监测。一旦监测到烟尘,系统将立即触发告警,提醒相关人员及时处理。这一系统的应用,可以有效预防严重的火灾事件,降低火灾事故发生的概率,保护人民生命财产安......
  • Python知识点:基于Python工具,如何使用Web3.py进行以太坊智能合约开发
    开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候!基于Python工具Web3.py进行以太坊智能合约开发简介智能合约是区块链技术的核心应用之一,它允许在没有中介的情况下,通过代码自动执行合同条款。以太坊是目前最流行的智......
  • Python知识点:基于Python工具,如何使用Brownie进行智能合约测试
    开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候!如何使用Brownie进行智能合约测试在以太坊智能合约开发中,测试是至关重要的一环。Brownie是一个基于Python的智能合约开发和测试框架,它提供了一套完整的工具来帮助开发......