百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

[2]Python面向对象-【5】继承

off999 2024-12-07 15:57 15 浏览 0 评论

在Python中,继承是一种对象编程的重要概念。继承允许您定义一个类,该类从现有类中继承属性和方法,以便您可以更轻松地编写新的类。本教程将为您介绍Python中的继承概念和如何使用它来创建和扩展类。

什么是继承

继承是一种面向对象编程中的重要概念。它允许您定义一个类,该类从另一个类中继承属性和方法。继承允许您重用现有代码,并使代码更易于管理。

Python中的继承是基于类的。当您定义一个类时,可以指定该类从另一个类继承。子类(也称为派生类)将继承父类(也称为基类)的所有属性和方法,并可以添加自己的属性和方法。子类可以覆盖继承的方法,并添加新方法。

创建一个子类

在Python中,创建子类很简单。只需定义一个新的类,并将其放在父类的括号中。例如,假设您有一个名为Person的父类,您可以使用以下代码创建一个名为Student的子类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade

在上面的代码中,Student类继承了Person类。因此,Student类将自动继承Person类的所有属性和方法。然后,Student类定义了自己的构造函数,该函数使用super()函数调用其父类的构造函数来设置name和age属性,并将grade属性设置为子类特有的属性。

访问继承的属性和方法

一旦您创建了一个子类,您就可以使用它继承的属性和方法。例如,使用上面的代码,您可以创建一个Student对象并访问其name和age属性:

student = Student('Alice', 18, 'A')
print(student.name)
print(student.age)

输出:

Alice
18

在上面的代码中,student对象继承了Person类的name和age属性,并可以像访问普通属性一样访问它们。

覆盖继承的方法

子类可以覆盖继承的方法。这是通过在子类中重新定义方法来实现的。例如,假设您有一个Person类,其中包含一个greet()方法,您可以使用以下代码在Student类中覆盖该方法:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        print(f"Hi, my name is {self.name}.")

class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade
    
    def greet(self):
        print(f"Hi, my name is {self.name} and I'm a student in grade {self.grade}.")

在上面的代码中,Student类覆盖了Person类的greet()方法。当您调用greet()方法时,将调用Student类的版本而不是Person类的版本:

student = Student('Alice', 18, 'A')
student.greet()

输出:

Hi, my name is Alice and I'm a student in grade A.

super()函数

当您在子类中定义一个新的构造函数或方法时,您通常需要调用父类的构造函数或方法。为此,您可以使用super()函数。super()函数返回一个临时对象,该对象允许您调用父类的方法。在上面的示例中,我们使用super().__init__(name, age)调用了Person类的构造函数。

多重继承

Python还支持多重继承,这意味着一个类可以从多个类继承。要指定多个父类,请将它们包含在一个元组中。例如,假设您有两个父类,一个是Person类,另一个是Teacher类,您可以使用以下代码创建一个名为TeachingAssistant的子类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        print(f"Hi, my name is {self.name}.")

class Teacher:
    def __init__(self, subject):
        self.subject = subject
    
    def teach(self):
        print(f"I'm teaching {self.subject}.")

class TeachingAssistant(Person, Teacher):
    def __init__(self, name, age, subject):
        Person.__init__(self, name, age)
        Teacher.__init__(self, subject)

在上面的代码中,TeachingAssistant类继承了Person类和Teacher类。因此,它将自动继承这两个类的属性和方法。TeachingAssistant类还定义了自己的构造函数,该函数分别调用父类的构造函数以设置属性。

另外,除了上面提到的继承的基础知识外,还有一些其他关于继承方面需要掌握的知识,让我们继续。

父类的属性和方法的访问权限

在子类中,您可以通过使用self关键字来访问父类的属性和方法。但是,父类的私有属性和方法(即以两个下划线开头的属性和方法)是不能被子类访问的。这种限制是出于安全和封装的目的。

如果您需要在子类中访问父类的私有属性或方法,您可以使用名称重整(name mangling)来间接地访问它们。在Python中,名称重整是通过在属性或方法名称前面添加两个下划线和一个类名来实现的。例如,假设您有一个Person类,它有一个私有属性__age,您可以使用以下代码在子类中访问它:

class Student(Person):
    def get_age(self):
        return self._Person__age

在上面的代码中,Student类重命名了__age属性,并在方法get_age()中使用它。

抽象类和接口

在Python中,您可以使用抽象类和接口来定义一个类的行为。抽象类是一个不能被实例化的类,它定义了一组方法,这些方法必须在子类中实现。接口是一组方法的规范,这些方法必须在实现接口的类中实现。

在Python中,抽象类和接口是通过在类定义中使用abc模块来实现的。以下是一个使用抽象类的示例:

import abc

class Shape(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def area(self):
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    
    def area(self):
        return self.side ** 2

在上面的代码中,Shape类是一个抽象类,它定义了一个抽象方法area(),这个方法必须在子类中实现。Square类是Shape类的子类,并实现了area()方法。

Mixin

Mixin是一种特殊的类,它被设计为在多个类之间共享一些相同的方法和属性。Mixin类通常不是作为独立的类来使用的,而是作为其他类的一部分。以下是一个使用Mixin的示例:

class PrintableMixin:
    def __repr__(self):
        return f"{type(self).__name__}({self.__dict__!r})"

class Person(PrintableMixin):
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade

在上面的代码中,PrintableMixin类是一个Mixin类,它定义了一些通用的方法,例如__repr__()方法,可以将一个对象转换为字符串。Person类继承了PrintableMixin类,并继承了__repr__()方法。Student类也继承了Person类和PrintableMixin类,并从Person类中继承了__repr__()方法。

使用Mixin类的好处是可以在多个类之间共享一些相同的代码,从而减少了代码重复。

多重继承

多重继承是指一个类可以同时从多个父类中继承属性和方法。在Python中,您可以通过在类定义中使用多个父类来实现多重继承。以下是一个使用多重继承的示例:

class Person:
    def __init__(self, name):
        self.name = name
    
    def greet(self):
        print(f"Hello, my name is {self.name}.")

class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    
    def study(self):
        print(f"{self.name} is studying.")

class CollegeStudent(Person, Student):
    def __init__(self, name, grade, major):
        Person.__init__(self, name)
        Student.__init__(self, name, grade)
        self.major = major
    
    def study(self):
        print(f"{self.name} is studying {self.major}.")

在上面的代码中,Person和Student类是两个父类,CollegeStudent类从这两个父类中继承了属性和方法。在CollegeStudent类中,__init__()方法分别调用了Person类和Student类的__init__()方法来初始化父类的属性。CollegeStudent类还覆盖了Student类的study()方法来实现自己的功能。

需要注意的是,多重继承可能会导致代码变得复杂和难以维护。在使用多重继承时,需要小心设计类之间的关系,以避免出现冲突和歧义。

方法重写(Overriding)

方法重写是指在子类中重新定义父类的方法,以实现不同的功能。子类可以覆盖父类的方法,也可以在父类的基础上添加新的方法。

以下是一个使用方法重写的示例:

class Person:
    def __init__(self, name):
        self.name = name
    
    def greet(self):
        print(f"Hello, my name is {self.name}.")

class Student(Person):
    def __init__(self, name, grade):
        super().__init__(name)
        self.grade = grade
    
    def greet(self):
        print(f"Hello, my name is {self.name} and I am in grade {self.grade}.")
    
    def study(self):
        print(f"{self.name} is studying.")

在上面的代码中,Student类继承了Person类,并重写了greet()方法。Student类的greet()方法覆盖了Person类的greet()方法,并添加了一个额外的信息(学年级)。这意味着当您调用greet()方法时,Student类的方法将覆盖Person类的方法。

需要注意的是,子类的方法重写可能会影响父类的行为。如果您在子类中重写父类的方法,请确保您理解重写的影响,并在必要时调用父类的方法。您可以使用super()函数来调用父类的方法,如上面的示例中所示。

总结

继承是面向对象编程中的一个重要概念,它允许子类从父类中继承属性和方法,并在此基础上添加新的功能。Python中的继承使用类的定义来实现,并可以使用单继承或多重继承。

当使用继承时,您需要考虑类之间的关系和继承的影响。您可以使用super()函数来调用父类的方法,并使用Mixin类来共享通用的代码。此外,方法重写可以在子类中重新定义父类的方法,以实现不同的功能。

希望这篇文章可以帮助到您,也欢迎关注、评论、转发~~

相关推荐

让 Python 代码飙升330倍:从入门到精通的四种性能优化实践

花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...

7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制

“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...

Python3.14:终于摆脱了GIL的限制

前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...

Python Web开发实战:3小时从零搭建个人博客

一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...

图解Python编程:从入门到精通系列教程(附全套速查表)

引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...

Python 并发编程实战:从基础到实战应用

并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...

吴恩达亲自授课,适合初学者的Python编程课程上线

吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...

Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件

在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...

Python turtle模块编程实践教程

一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...

Python 中的asyncio 编程入门示例-1

Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...

30天学会Python,开启编程新世界

在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...

Python基础知识(IO编程)

1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...

Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!

Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...

一文带你了解Python Socket 编程

大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...

Python-面向对象编程入门

面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...

取消回复欢迎 发表评论: