类中,构造方法、普通方法、类方法、静态方法和魔术方法的区别

class ExampleClass:class_variable = "I am a class variable"# 构造方法(Constructor)def __init__(self, instance_variable):self.instance_variable = instance_variable# 普通方法(Method)def instance_method(self):print(f"Instance method called with value: {self.instance_variable}")# 类方法(Class Method)@classmethoddef class_method(cls):print(f"Class method called with class variable: {cls.class_variable}")# 静态方法(Static Method)@staticmethoddef static_method():print("Static method called")# 魔术方法(Magic Methodsdef __str__(self):return f"ExampleClass instance with value: {self.instance_variable}"# 创建类的实例
obj = ExampleClass("example")# 调用实例方法
obj.instance_method()# 调用类方法
ExampleClass.class_method()# 调用静态方法
ExampleClass.static_method()# 输出字符串表示
print(obj)
Instance method called with value: example
Class method called with class variable: I am a class variable
Static method called
ExampleClass instance with value: example

1、构造方法(Constructor):

  • 构造方法是在创建对象时自动调用的特殊方法。
  • 它的主要目的是用于初始化对象的属性或执行对象的一些必要设置。
  • 在Python中,构造方法的名称是 __init__,并且它始终在对象创建后立即调用。
  • 构造方法通常用于执行一些对象的初始化工作,例如设置实例变量的初始值。

2、普通方法(Method):

  • 普通方法是类中的普通函数,用于执行一些与对象相关的操作。
  • 它可以访问类的属性,并且可能修改对象的状态。
  • 普通方法没有特殊的名称,可以根据需要定义。

3、类方法(Class Method):

  • 类方法是用 @classmethod 装饰器修饰的方法。
  • 类方法的第一个参数是类本身,通常被命名为 cls
  • 类方法可以访问和修改类级别的属性,但不能访问实例级别的属性。

4、静态方法(Static Method):

  • 静态方法是用 @staticmethod 装饰器修饰的方法。
  • 静态方法与类和实例无关,不接收类或实例作为第一个参数。
  • 静态方法不能访问或修改类级别或实例级别的属性。

5、魔术方法(Magic Methods):

  • 魔术方法是以双下划线开头和结尾的方法,如 __init____str__ 等。
  • 这些方法在特定的情况下由解释器调用,用于执行特殊的操作。
  • 例如,__init__ 用于对象的初始化,__str__ 用于返回对象的字符串表示。

具体例子:

class BankAccount:bank_balance = 0def __init__(self, account_holder, initial_balance=0):self.account_holder = account_holderself.balance = initial_balancedef deposit(self, amount):self.balance += amountprint(f"{self.account_holder} deposited ${amount}. New balance: ${self.balance}")def withdraw(self, amount):if amount <= self.balance:self.balance -= amountprint(f"{self.account_holder} withdrew ${amount}. New balance: ${self.balance}")else:print(f"Insufficient funds for {self.account_holder}. Balance: ${self.balance}")@classmethoddef total_balance(cls):print(f"Total bank balance: ${cls.bank_balance}")@staticmethoddef is_business_hours():# Assume business hours are from 9 AM to 5 PMcurrent_hour = 15  # Just an example, should use current time in a real applicationreturn 9 <= current_hour <= 17def __str__(self):return f"Account Holder: {self.account_holder}, Balance: ${self.balance}"# 创建账户实例
account1 = BankAccount("Alice", 1000)
account2 = BankAccount("Bob", 500)# 存款和取款操作
account1.deposit(200)
account2.withdraw(100)# 类方法 - 查看总余额
BankAccount.total_balance()# 静态方法 - 检查是否是营业时间
print(f"Is it business hours? {'Yes' if BankAccount.is_business_hours() else 'No'}")# 输出账户信息
print(account1)
print(account2)
  1. 构造方法 __init__

    • 作用: 用于初始化对象的属性,在对象创建时自动调用。
    • 参数: 接受 account_holder(账户持有人)和可选的 initial_balance(初始余额)作为参数。
    • 用法: 在创建账户实例时调用,设置账户的初始属性。
  2. 普通方法 depositwithdraw

    • 作用: 执行普通的实例级别操作,分别用于存款和取款。
    • 参数: amount 表示存款或取款的金额。
    • 用法: 被调用时会修改实例的 balance 属性,并输出相关信息。
  3. 类方法 total_balance

    • 作用: 访问和修改类级别的属性,这里用于查看所有账户的总余额。
    • 参数: cls(类本身)作为第一个参数。
    • 用法: 通过类名调用,可以访问和修改类级别的属性。
  4. 静态方法 is_business_hours

    • 作用: 与类和实例无关的操作,用于检查当前是否是营业时间。
    • 参数: 无参数,与类和实例无关。
    • 用法: 通过类名或实例名调用,不会访问实例级别的属性。
  5. 魔术方法 __str__

    • 作用: 定义对象的字符串表示形式,使对象能够以友好的方式呈现。
    • 参数: 无参数,除了 self 表示对象本身。
    • 用法:print 函数调用,返回对象的字符串表示。

        总的来说,这五种方法在类中的作用和使用方式不同。构造方法用于初始化对象,普通方法用于实例级别的操作,类方法用于类级别的操作,静态方法与类和实例无关,而魔术方法用于定义对象的字符串表示。

结果:

# 这里current_hour(假设为15),实际运行时可能会得到不同的输出,具体取决于实际的运行时间。
Alice deposited $200. New balance: $1200
Bob withdrew $100. New balance: $400
Total bank balance: $0
Is it business hours? Yes
Account Holder: Alice, Balance: $1200
Account Holder: Bob, Balance: $400

结果分析:

  1. Alice 存入 $200,余额变为 $1200。
  2. Bob 取款 $100,余额变为 $400。
  3. total_balance 类方法被调用,输出总银行余额为 $0。
  4. is_business_hours 静态方法被调用,输出是否为营业时间(在这个例子中,假设是)。
  5. 打印出两个账户的信息,包括账户持有人和当前余额。

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

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

相关文章

大型语言模型,用最少的数学和行话进行解释

本文来自于《Large language models, explained with a minimum of math and jargon》&#xff0c;不嵌入任何笔者的个人理解&#xff0c;只是对原文的总结与记录。 文章作者是Tim Lee和Sean Trott&#xff0c;Tim Lee是一位拥有计算机科学硕士学位的记者&#xff0c;Sean Trot…

【二十】【动态规划】879. 盈利计划、377. 组合总和 Ⅳ、96. 不同的二叉搜索树 ,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

关于jupyter突然打不开的问题

好久没有用python了&#xff0c;我的电脑环境是安装过anaconda和pycharm&#xff0c;但是有些简单的东西就希望在jupyter中测试一下&#xff0c;但是最近发现jupyter打不开了。 具体是&#xff1a; 在这里打开jupyter是可以的&#xff0c;但是在命令行就不行&#xff0c;表现为…

计算机毕业设计 | SpringBoot+vue的家庭理财 财务管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 网络的发展已经过去了七十多年&#xff0c;网络技术的发展&#xff0c;将会影响到人类的方方面面&#xff0c;网络的出现让各行各业都得到了极大的发展&#xff0c;为整个社会带来了巨大的生机。 现在许多的产业都与因特网息息相关&#xff…

Python实现华容道问题详解

概要 华容道是一种古老的中国益智游戏&#xff0c;最早出现在中国的《千古文馆》中。这个游戏的目标是将一块特殊的方块从一个方形的棋盘中移出&#xff0c;通过滑动其他的方块来达到这个目标。本文将介绍如何使用Python来实现华容道问题&#xff0c;并提供详细的代码示例。 游…

飞鱼CRM接入第三方系统 飞鱼API对接详细教程

场景描述 在白码低代码开发平台中&#xff0c;是支持外部crm系统的线索通过接口流入到白码系统里面&#xff0c;换而言之&#xff0c;只要外部的系统有线索api接口&#xff0c;白码系统可以接收线索并在白码系统上进行后续操作。本文以飞鱼crm系统为例&#xff0c;讲解如何接收…

DEJA_VU3D - Cesium功能集 之 115-雷达扫描(靶心效果)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…

学习就要从简单的开始嘛,开始学一个个人博客吧

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

Linux/Haystack

Enumeration nmap 还是先看看端口对外开放情况&#xff0c;对外开放了22,80,9200 22应该是ssh&#xff0c;80是web&#xff0c;9200不知道是什么 TCP/80 访问web&#xff0c;没有什么链接&#xff0c;只有一张图片 有可能图片中有些东西&#xff0c;但还是尝试扫描一下网站…

ptaR7-6/zzuli2106 有去有回

题目 输入n个整数&#xff0c;第一趟按从左到右间隔k个数取数据&#xff0c;然后第二趟再从右到左间隔k-1个数取余下的数&#xff0c;如果数据没有取完&#xff0c;下一趟再间隔k-2个从左到右取数据&#xff0c;如此反复&#xff0c;直到所有的数据取完为止。注意&#xff1a;…

《SRE Google 运维解密》笔记

指导思想 介绍 Google 生产环境介绍 borg 是 k8s 的前身。 拥抱风险 服务质量 现在的 SLO 没有更细粒度的划分到季度 如果划分到季度&#xff0c;需要用这个数据来限制什么或者进行什么活动&#xff1f; L1S 链路的 SLA 的签署工作已经做了很多 对于 SLA 的达成情况数据没有…

Iceberg从入门到精通系列之十九:分区

Iceberg从入门到精通系列之十九&#xff1a;分区 一、认识分区二、Iceberg的分区三、Hive 中的分区四、Hive 分区问题五、Iceberg的隐藏分区六、分区变换七、分区变换 一、认识分区 分区是一种通过在写入时将相似的行分组在一起来加快查询速度的方法。 例如&#xff0c;从日志…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

IPv6路由协议---IPv6动态路由(OSPFv3-3)

OSPFv3使用Link-local地址 OSPFv3是运行在IPv6上的路由协议,同样使用链路本地地址来维持邻居,同步LSA数据库。除Vlink外的所有OSPFv3接口都使用链路本地地址作为源地址及下一跳来发送OSPFv3报文,带来的好处: 不需要配置IPv6全局地址,就可以得到OSPFv3拓扑,实现拓扑与地址…

【职工管理系统(C++版)】

一、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息。 本次主要利用C来实现一个基于多态的职工管理系统。 公司中职工分为三类:普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责。 普通员工职责:完成经…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤&#xff08;黑马springCloud的p29&#xff0…

springboot邮件发送

一、讲一下thymeleaf的简单使用 1.在根路径下写一个 resources/templates/good.html 文件 2. 在代码实现 记得 不要加 RequestBody这个注解&#xff0c;因为它会把string当作普通 的字符串&#xff0c;而不是去渲染对应的good.html视图 3.看效果 关于图片的显示&#xff0…

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…

【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 动态规划 LeetCode3003 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作&#xff0c;直到字符串 s 变为 空&#xff1…

四大会计假设

目录 一. 会计主体假设二. 持续经营假设三. 会计期间假设四. 货币计量假设 \quad \quad 一. 会计主体假设 \quad 会计主体: 会计工作为其服务的特定单位或组织。 会计主体的定义 1.具有一定数量的资金。 2.进行独立的生产经营或其他活动。 3.实行独立核算。 \quad 会计主体假设…