面向对象 类函数的区别 实例方法 类方法 静态方法 抽象方法

news/2024/12/24 8:20:59/

前言:面向对象类方法的说明:

  1. 实例方法

    • 定义:实例方法是在类中定义的,用于操作类的实例(对象)的属性和行为的方法。它的第一个参数通常是self(在 Python 中)或this(在 Java、C++ 等语言中),这个参数代表类的实例本身。
    • 区别
      • 与类的关联方式:实例方法与类的特定实例紧密相关。它可以访问和修改实例的属性,不同的实例调用同一个实例方法时,操作的是各自的属性。例如,在一个Person类中有一个age属性,每个Person实例的age可以不同,实例方法increase_age可以根据每个实例的age属性进行不同的操作。
      • 调用方式:需要通过类的实例来调用。例如,在 Python 中,如果有一个Person类,person = Person(),那么person.increase_age()就是调用实例方法。
    • 适用点
      • 对象行为模拟:当需要模拟对象的特定行为时,比如Car类中的drive方法,它可以改变汽车对象的速度、里程等属性,体现汽车的行驶行为。
      • 访问和修改对象属性:如果要获取或修改对象的属性,例如BankAccount类中的depositwithdraw方法,可以操作账户余额这个属性。
  2. 类方法

    • 定义:类方法是属于整个类的方法,它使用特定的装饰器(如 Python 中的@classmethod)来定义,第一个参数通常是代表类本身的cls(在 Python 中)。
    • 区别
      • 与类的关联方式:类方法与类本身相关联,而不是与类的实例。它可以访问和修改类的属性(静态属性),这些属性是被类的所有实例共享的。例如,一个Counter类有一个count属性记录实例的创建数量,类方法get_count可以返回这个共享的count属性的值。
      • 调用方式:可以通过类名直接调用,也可以通过实例调用,但一般建议通过类名调用。例如,在 Python 中,对于MyClass类,MyClass.class_method()或者obj = MyClass(); obj.class_method()(虽然可以这样做,但不推荐)。
    • 适用点
      • 工厂方法创建实例:用于创建类的实例的工厂方法通常定义为类方法。例如,Date类可以有一个类方法from_string,它接受一个日期字符串并返回一个Date类的实例。
      • 操作类级别的属性和状态:如果有一些属性或状态是与整个类相关的,而不是与单个实例相关,如类的配置参数,类方法可以用于设置和获取这些参数。
  3. 静态方法

    • 定义:静态方法是定义在类中的方法,但它不依赖于类的实例或类的状态。它使用特定的装饰器(如 Python 中的@staticmethod)来定义,没有类似selfcls这样的特殊参数。
    • 区别
      • 与类和实例的关联方式:静态方法既不与类的实例相关,也不与类本身的内部状态(如实例属性或类属性)相关。它更像是一个被组织在类命名空间中的普通函数。
      • 调用方式:可以通过类名或者类的实例调用,但调用方式与类和实例的状态无关。例如,在 Python 中,对于MyClass类,MyClass.static_method()或者obj = MyClass(); obj.static_method()
    • 适用点
      • 工具方法组织:当有一些与类相关的辅助功能,但又不涉及类的实例或类的状态时,适合定义为静态方法。例如,在一个MathUtils类中,addmultiply等数学运算方法可以定义为静态方法,方便代码的组织和调用。
      • 独立于对象和类状态的操作:比如一个FileUtils类中的check_file_extension方法,它只是检查文件名的扩展名,不依赖于文件对象的实例属性或者类的其他属性。
  4. 抽象方法(在抽象类中)

    • 定义:抽象方法是在抽象类中定义的方法,它只有方法签名,没有具体的方法体。在一些语言中(如 Python 通过abc模块),使用特定的装饰器(如@abstractmethod)来定义。
    • 区别
      • 与其他方法的关联方式:抽象方法是一种规范,它规定了子类必须实现的方法。它本身不能被实例化的类调用,因为没有具体的实现内容。与实例方法、类方法、静态方法不同,它不是用于直接的操作,而是用于定义接口。
      • 调用方式:抽象方法不能直接调用,它需要在子类中实现后才能通过子类的实例或类(如果是类方法形式的抽象方法)来调用。
    • 适用点
      • 接口定义和强制实现:在设计模式中,如策略模式、模板方法模式等,抽象方法用于定义一个通用的接口,强制子类按照这个接口实现特定的行为,确保不同子类的行为一致性和可替换性。例如,在一个图形绘制系统中,Shape抽象类可以有抽象方法draw,不同形状(如圆形、矩形等)的子类必须实现这个draw方法来绘制自己的形状。


http://www.ppmy.cn/news/1557689.html

相关文章

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

基于字节大模型的论文翻译(含免费源码)

基于字节大模型的论文翻译 源代码: 👏 star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型(Large Language Model, LLM)的论文阅读与翻译辅助工具。它通过用户界面&#xff08…

【Django篇】--动手实践Django基础知识

一、url视图映射 在url.py中定义两个视图函数,并添加到urlpatterns中用于访问。 from django.contrib import admin from django.urls import path from django.shortcuts import HttpResponse# 默认的地址为:http://127.0.0.1:8000/# 如果我想要访问默…

Java 8使用Stream流去除一个list中包含另一个list已存在的某个字段的对象

项目场景: 在Java中,我们经常会遇到需要对List中的数据进行操作的情况。有时候,我们需要从一个List中删除另一个List已经包含的数据。这种情况下,我们可以使用Java Stream来简洁高效地完成操作。 代码示例 假设我们有两个对象列表…

CentOS7网络配置,解决不能联网、ping不通外网、主机的问题

1. 重置 关闭Centos系统 编辑->虚拟网络编辑器 还原默认设置 2. 记录基本信息 查看网关地址,并记录在小本本上 查看网段,记录下 3. 修改网卡配置 启动Centos系统 非root用户,切换root su root查看Mac地址 ifconfig 或 ip addr记录下来 修改配置文件 vim /et…

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机(单目/双目/RGBD)与IMU结合起来就是视觉惯性,通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度,可分为6轴(6个自由度)和9轴(9个自由度)IMU,具体的关于IMU的介…

使用C++调用YOLOv8模型的一般步骤

文章目录 一、准备工作二、创建C++项目并配置环境三、代码实现四、注意事项一、准备工作 安装依赖库 首先需要安装OpenCV库,用于图像的读取、处理等操作。OpenCV的安装方式因操作系统而异,例如在Ubuntu系统中,可以通过以下命令安装:sudo apt-get install libopencv-dev在Wi…

短视频矩阵源码开发部署全解析

矩阵源码部署开发的专业注意事项 应用场景概述 在开发和构建抖音矩阵系统、短视频矩阵号系统或抖音SEO矩阵系统等应用时,需关注以下关键细节。 视频上传与处理 对于短视频矩阵,必须实现视频的上传与处理模块。视频上传环节涉及文件存储及传输问题&…