[重学Python]Day7 面向对象编程:封装、继承、多态

[重学Python]Day7 面向对象编程:封装、继承、多态

  • 一、面向对象编程的特性
      • 1、封装
      • 2、继承
      • 3、多态
  • 二、静态方法和类方法
  • 三、类之间的关系
        • 1、is-a
        • 2、has-a
        • 3、use-a
  • 四、继承
  • 五、重写和多态

一、面向对象编程的特性

面向对象编程的三大特性,封装、继承、多态

1、封装

封装就是把客观事物封装成抽象的类,并隐藏实现细节,使得代码模块化。比如在上篇文章(Day 6)中,我们把”汽车“这个客观事物封装成一个类,这个类有颜色、品牌、速度等,下文我们会提到方法,而这些属性和方法的具体实现则被隐藏起来,使用者只需要知道这个类有哪些属性和方法,不需要知道这些方法是如何实现的。

2、继承

继承是面向对象编程的另一个重要特性,它提供了一种无需重写、使用现有类的所有功能并进行扩展的能力。比如,我可以定义个”电车“类,它继承了”Car“,就自动拥有了”Car“类的所有属性和方法,比如颜色、品牌等。然后我们还可以在”电车“类上增加一些新的属性和方法,比如电池容量、充电方法等。

3、多态

多态是指同一操作用于不同的对象,可以有不同的解释,产生不同的执行结果。比如,我们定义了一个”Car“类,它有一个”启动“方法,然后我们又定义了一个”电车“类,它继承了”Car“类,也有一个”启动“方法,但是”电车“类的”启动“方法的实现可能与”Car“类的不同,这就是多态。

二、静态方法和类方法

之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息,实际上,我们写在类中的方法不需要都是对象方法,例如我们顶一个一个三角形类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然不是对象方法,因为在调用这个方法时三角形对象尚未创建出来,所以这个方法是属于三角形类而不是属于三角形对象的,我们可以使用静态方法来解决这类问题。

from math import sqrt

class Triangle(object):

    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c

    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b
    def perimeter(self):
        return self.a + self.b + self.c

    def area(self):
        half = self.perimeter() / 2
        return sqrt(half * (half - self.a) * (half - self.b) * (half - self.c))

def main():
        a , b, c  = 6, 8, 10
        if Triangle.is_valid(a,b,c):
            t = Triangle(a,b,c)
            print(t.perimeter())
            # 也可以通过给类发消息来调用对象方法,但是要传入接收消息的对象作为参数
            print(Triangle.area(t))

        else:
            print("Unable to form a Triangle")

if __name__ == '__main__':
    main()

和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象),通过这个参数我们可以获取和类相关的信息并且可以创建出来的对象。

from time import time, localtime, sleep


class Clock(object):
    """数字时钟"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls):
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)

    def run(self):
        """走字"""
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0

    def show(self):
        """显示时间"""
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)


def main():
    # 通过类方法创建对象并获取系统时间
    clock = Clock.now()
    while True:
        print(clock.show())
        sleep(1)
        clock.run()


if __name__ == '__main__':
    main()

三、类之间的关系

类和类之间存在三种关系:is-a has-a use-a

1、is-a

也叫做继承和繁华,比如汽车和交通工具,人和动物的关系都属于继承关系

2、has-a

也叫做关联,比如学生和所在学院,显卡和主机都属于关联。关联关系如果是整体和部分的关联,那么叫做聚合关系,如果整体进一步负责了部分的生命周期,就是整体和部分是不可分割的,也叫做合成关系

3、use-a

也叫做依赖,比如一个司机有一个驾驶的行为(方法),其中使用到了汽车,那么司机和汽车的关系就是依赖关系

利用类之间的这些关系,我们可以在已有类的基础上来完成某些操作,也可以在已有类的基础上创建新的类,这些都是实现代码复用的重要手段。复用现有的代码不仅可以减少开发的工作量,也有利于代码的管理和维护,这是我们在日常工作中都会使用到的技术手段。

四、继承

在已有类的基础上创建新类,就是让一个类从另一个类那里将属性和方法直接继承下来,从而减少重复代码的编写。提供继承信息的叫做父类,也叫做超类和基类,得到信息的称为子类,也叫派生类和衍生类。子类除了继承父类提供的属性和方法,还可以定义自己特有的属性和方法,所以子类比父类有更多的能力。

class Person(object):

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

    def  name(self):
        return self.name

    def age(self):
        return self.age()

    def eatBBQ(self):
        print('%s正在吃阿根廷烤肉.' % self.name)

class Football_Player(Person):

    def __init__(self, name, age, title):
        super().__init__(name, age)
        self.title = title

    def title(self):
        return self.title

    def title(self, title):
        self.title = title

    def workfor(self, team):
        print('%s%s效力于%s.' % (self.title, self.name, team))

def main():
    fb = Football_Player('Messi',37,'Goat')
    fb.workfor('迈阿密国际')
    fb.eatBBQ()

if __name__ == '__main__':
    main()
    
输出:
GoatMessi效力于迈阿密国际.
Messi正在吃阿根廷烤肉.

五、重写和多态

子类在继承了父类的方法后,可以对父类已有的方法给出新的版本,这个过程叫做方法的重写(override)。通过重写,可以让父类的同一个行为在子类中出现不同的版本,当调用这个重写后的子类方法时,不同的子类对象会有不同的行为,这个就是多态。

from abc import ABCMeta, abstractmethod
# 在Python的abc模块中,ABC和ABCMeta是两个关键类,用于创建抽象基类(Abstract Base Class)。
# 通过将ABCMeta作为元类,可以在类定义阶段对类进行检查和修饰。
# ABCMeta通过在类定义中使用metaclass参数或在类的基类列表中包含ABCMeta来指定。
# ABCMeta元类提供了一些功能,例如检查子类是否实现了抽象方法、注册具体实现类等。

class Pet(object, metaclass=ABCMeta):
    """宠物"""

    def __init__(self, nickname):
        self._nickname = nickname

    @abstractmethod
    def make_voice(self):
        """发出声音"""
        pass


class Dog(Pet):
    """狗"""

    def make_voice(self):
        print('%s: 汪汪汪...' % self._nickname)


class Cat(Pet):
    """猫"""

    def make_voice(self):
        print('%s: 喵...喵...' % self._nickname)


def main():
    pets = [Dog('大黄'), Cat('咪咪'), Dog('二黄')]
    for pet in pets:
        pet.make_voice()


if __name__ == '__main__':
    main()

Pet是一个抽象类,抽象类的存在就是为了让其他类去继承它,Python从语法层面讲没有java那样对抽象类的支持,所以我们通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果,如果一个类中存在抽象方法,那么这个类不能够创建对象(实例化)。上文中,Dog和Cat对Pet中的voice方法进行了重写,当我们在main中调用该方法时,这个方法就表现为多态,即同样的方法做了不同的事情。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCv的图像二值图和灰度直方图

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

Python新手入门基础英文笔记

1、字符串的操作 user:用户 name:名称/姓名 attibute:字段/属性 Value:值 2、重复/转换/替换/原始字符号 upper:上面 lower:下面 capitalize:用大写字母写或印刷 title:标题…

「笔试刷题」:求最小公倍数

一、题目 输入描述: 输入两个正整数A和B。 输出描述: 输出A和B的最小公倍数。 示例1 输入: 5 7 输出: 35 示例2 输入: 2 4输出: 4二、思路解析 这道题,也是模拟实现这一大类的一题…

探索的时光 (整数三分)

本题链接:登录—专业IT笔试面试备考平台_牛客网 题目: 样例: 输入 5 3 2 1 2 3 输出 28 思路: 根据题意,已经给出了运算函数 当我们看到这些函数的时候,联想一下,它们的单调性,以…

Adobe PS 2023、Adobe Photoshop 2023下载教程、安装教程

Adobe Photoshop &#xff08;<-下载连接&#xff09;简介&#xff1a; Adobe Photoshop是一款广泛使用的图像处理软件&#xff0c;由Adobe公司开发。它提供了许多强大的工具和功能&#xff0c;可以用于图像编辑、合成、修饰、设计等各个领域。用户可以使用Photoshop来调整…

HotSpot VM概述

许多技术人员只把JVM当成黑盒&#xff0c;要想改善Java应用的性能和扩展性无疑是一项艰巨的任务。若要提高Java性能调优的能力&#xff0c;就必须对现代JVM有一定的认知。 HotSpot VM是JDK 1.3版本之后默认的虚拟机&#xff0c;目前是使用最广泛的Java虚拟机。本文主要介绍HotS…

行为型设计模式

一、责任链设计模式 &#xff08;一&#xff09;概念 使多个对象都有机会处理同一个请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 &#xff08;二&#xf…

算法学习Day1——【数据结构】单调栈

1.什么是单调栈以及单调栈的作用 &#xff08;1&#xff09;定义 顾名思义&#xff0c;单调栈是一个有序的栈&#xff0c;可能从栈顶到栈底单调递增&#xff08;单调递增栈&#xff09;&#xff0c;也有可能从栈顶到栈底单调递减&#xff08;单调递减栈&#xff09;。 &…

芯启智行丨基于G32A1445的汽车音乐律动氛围灯解决方案

随着智能汽车技术的深度渗入&#xff0c;汽车照明作为汽车设计的重要组成部分&#xff0c;正在重塑驾驶员与汽车的互动方式&#xff0c;从简单的照明工具优化升级为承载更多丰富功能和不同应用场景的智能化安全装置。现代智能车型广泛配备了前照灯、车内环境氛围灯、尾灯等汽车…

栈和链表的区分

栈&#xff08;Stack&#xff09;&#xff1a; 栈是一种特殊的线性表&#xff0c;遵循“后进先出”&#xff08;Last In First Out, LIFO&#xff09;原则。栈通常用数组或链表来实现&#xff0c;但重点在于其操作的限制而非底层数据结构。无论使用顺序栈&#xff08;基于数组…

读懂一本书笔记

文章目录 引言 我是一个用读书改变自己生活的人01 会读书&#xff0c;更要会讲书复杂时代&#xff0c;阅读是大众反脆弱的武器你焦虑吗&#xff1f;如何从“单向度的人”变为“多向度的人”第一&#xff0c;读书是主动的学习方式第二&#xff0c;读书是有针对性的学习方式 讲书…

kettle下载安装

下载方式&#xff1a; 1.官网下载 kettle下载链接&#xff1a; 老网站下载链接&#xff1a;https://sourceforge.net/projects/pentaho/files/这个网站已经弃用了 新网站地址获取方法&#xff1a;老网站下载链接打开&#xff0c;可以看到一个pdf下载链接&#xff0c;下载pdf 打…

二维码门楼牌管理应用平台建设:共治力量信息管理的革新

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、共治力量信息管理的重要性三、二维码门楼牌管理应用平台在共治力量信息管理中的应用四、二维码门楼牌管理应用平台的优势与挑战五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成…

Spark原理之Cache Table的工作原理及实现自动缓存重复表的思考

CACHE TABLE的能力 使用此语法&#xff0c;可以由用户自定义要缓存的结果集&#xff0c;实际上就是一个临时表&#xff0c;不过数据存储在Spark集群内部&#xff0c;由Application所分配的executors管理。 一旦定义了一个缓存表&#xff0c;就可以在SQL脚本中随处引用这个表名…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…

【Qt】QtCreator忽然变得很卡

1. 问题 Qt Creator忽然变得很卡。电脑里两个版本的Qt Creator&#xff0c;老版本的开启就卡死&#xff0c;新版本好一点&#xff0c;但是相比于之前也非常卡&#xff0c;最明显的是在 ctrl鼠标滚轮 放大缩小的时候&#xff0c;要卡好几秒才反应。 2. 解决方案 2.1 方法1 关…

XL520无线接收芯片,2.2ms超低启动时间,-110dBm高接收灵敏度

XL520接收芯片采用SOP8封装&#xff0c;适用于300MHz- 440MHz频率范围&#xff0c;正常工作电压范围2.0~5.5V&#xff0c;工作电流在3.0~3.2mA之间。它具有快速的启动时间&#xff08;2.2ms&#xff09;和高达-110dBm的接收灵敏度&#xff0c;非常适合对低功耗要求严格的设备。…

测试工程师——招聘分析

测试工程师 随着互联网行业的高速发展,快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求,而在短期迭代的快节奏中,传统测试工作面对更大压力,无法持续提供高效率高质量的人力支撑,所以越来越多的企业需要技术更为全面的测试开发工程师。测试开发 本质上属于测…

Web安全的最后一道防线:细谈Gobuster的目录/文件/Vhost/DNS子域名暴力破解艺术

一、前言 Gobuster是一款用go语言编写的对于网站目录/文件、DNS子域、虚拟主机vhost进行暴力穷举的开源工具&#xff0c;常用于安全领域&#xff0c;其常用的暴力破解模式到目前为止&#xff08;3.6版本&#xff09;有如下几种&#xff1a; 模式含义dir最经典的文件路径/目录破…

深入Rust标准库:必备的Rust语言高级指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…