【python实操】python小程序之魔法方法(__init__方法、__str__方法、__del__方法)

news2024/10/9 16:35:50

引言

python小程序之魔法方法(__init__方法、__str__方法、__del__方法)

文章目录

  • 引言
  • 一、__init__方法
    • 1.1 题目
    • 1.2 代码
    • 1.3 代码解释
      • 1.3.1 逐行注释
      • 1.3.2 代码执行过程
  • 二、__str__方法
    • 2.1 题目
    • 2.2 代码
    • 2.3 代码解释
  • 三、__del__方法
    • 3.1 题目
    • 3.2 代码
    • 3.3 代码解释
  • 四、思考
    • 4.1 __init__方法
      • 4.1.1 语法
      • 4.1.2 参数
      • 4.1.3 用途
      • 4.1.4 示例
      • 4.1.5 注意事项
    • 4.2 __str__方法
      • 4.2.1 一个包含 `__str__` 方法的简单类的例子
      • 4.2.2 `__str__`方法的一些规则
    • 4.3 __del__方法
      • 4.3.1 为什么“代码执行结束”在del方法前打印

一、__init__方法

1.1 题目

如何使用__init__方法

1.2 代码

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

    def show_info(self):
        print(f'小猫的名字是:{self.name},小猫的年龄是:{self.age}岁')


blue_cat = Cat('小蓝', '3')
print(blue_cat.name)
blue_cat.show_info()

pink_cat = Cat('大粉', 4)
print(pink_cat.name)
pink_cat.show_info()

输出结果:
在这里插入图片描述

1.3 代码解释

1.3.1 逐行注释

这段代码定义了一个名为 Cat 的类,该类有两个属性:nameage,以及一个名为 show_info 的方法

class Cat:  # 定义一个名为Cat的类
    def __init__(self, name, age):  # 定义一个特殊方法__init__,它是类的构造器
        self.name = name  # 将传入的name参数赋值给对象的name属性
        self.age = age    # 将传入的age参数赋值给对象的age属性
    def show_info(self):  # 定义一个名为show_info的方法
        print(f'小猫的名字是:{self.name},小猫的年龄是:{self.age}岁')  # 打印出小猫的名字和年龄
# 使用Cat类创建一个名为blue_cat的实例,并传入'小蓝'和'3'作为参数
blue_cat = Cat('小蓝', '3')
print(blue_cat.name)  # 打印blue_cat实例的name属性,输出:小蓝
blue_cat.show_info()  # 调用blue_cat实例的show_info方法,输出:小猫的名字是:小蓝,小猫的年龄是:3岁
# 使用Cat类创建另一个名为pink_cat的实例,并传入'大粉'和4作为参数
pink_cat = Cat('大粉', 4)
print(pink_cat.name)  # 打印pink_cat实例的name属性,输出:大粉
pink_cat.show_info()  # 调用pink_cat实例的show_info方法,输出:小猫的名字是:大粉,小猫的年龄是:4岁

1.3.2 代码执行过程

  1. 定义了一个 Cat 类,该类有一个构造器 __init__ 和一个方法 show_info
  2. 使用 Cat 类创建了两个实例:blue_catpink_cat
  3. 在创建 blue_cat 实例时,将字符串 '小蓝' 赋值给 name 属性,将字符串 '3' 赋值给 age 属性
  4. 在创建 pink_cat 实例时,将字符串 '大粉' 赋值给 name 属性,将整数 4 赋值给 age 属性
  5. 通过 print 函数打印出 blue_catpink_cat 实例的 name 属性
  6. 通过调用 show_info 方法打印出 blue_catpink_cat 实例的详细信息,包括它们的名字和年龄

注意,在创建 blue_cat 实例时,年龄是以字符串 '3' 传入的,而不是整数 3。这不会影响 show_info 方法的输出,因为 print 函数能够将字符串和整数类型的数据格式化为字符串进行打印。但是,如果想在后续代码中使用 age 属性进行数学运算,则应该确保它是一个整数

二、__str__方法

2.1 题目

如何使用__str__方法

2.2 代码

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

    def show_info(self):
        print(f'小猫的名字是:{self.name},小猫的年龄是:{self.age}岁')

    def __str__(self):
        return f'小猫的名字是_str:{self.name},小猫的年龄是:{self.age}'


blue_cat = Cat('小蓝', '3')
print(blue_cat.name)
print(blue_cat)

pink_cat = Cat('大粉', 4)
print(pink_cat)

输出结果:
在这里插入图片描述

2.3 代码解释

这段代码定义了一个名为 Cat 的类,该类有两个实例变量 nameage,以及三个方法:__init__show_info__str__

class Cat:

这行代码定义了一个名为 Cat 的类。

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

这是一个构造器方法 __init__,它在创建 Cat 类的新实例时被调用。它接收两个参数 nameage,并将它们分别赋值给实例变量 self.nameself.age

    def show_info(self):
        print(f'小猫的名字是:{self.name},小猫的年龄是:{self.age}岁')

这个方法 show_info 当被调用时,会打印出实例的 nameage

    def __str__(self):
        return f'小猫的名字是_str:{self.name},小猫的年龄是:{self.age}'

__str__ 方法定义了当类的实例被转换为字符串时应该返回的字符串。在这个例子中,它返回一个包含 nameage 的格式化字符串
接下来,代码创建了两个 Cat 类的实例:

blue_cat = Cat('小蓝', '3')

这行代码创建了一个名为 blue_catCat 实例,其名字为 '小蓝',年龄为字符串 '3'

print(blue_cat.name)

这行代码打印出 blue_cat 实例的 name 属性,输出结果为 '小蓝'

print(blue_cat)

这行代码打印出 blue_cat 实例的字符串表示。由于 Cat 类定义了 __str__ 方法,所以这里会调用 __str__ 方法,输出结果为 '小猫的名字是_str:小蓝,小猫的年龄是:3'

pink_cat = Cat('大粉', 4)

这行代码创建了一个名为 pink_catCat 实例,其名字为 '大粉',年龄为整数 4

print(pink_cat)

这行代码打印出 pink_cat 实例的字符串表示。同样,由于 Cat 类定义了 __str__ 方法,这里会调用 __str__ 方法,输出结果为 '小猫的名字是_str:大粉,小猫的年龄是:4'

注意,在创建 blue_cat 实例时,年龄被传递为一个字符串 '3',而不是整数 3。这可能会导致在某些情况下类型不匹配的问题,例如,如果你想要在代码的其他部分对年龄进行算术运算。正确的做法是将年龄传递为整数。在创建 pink_cat 实例时,年龄正确地被传递为整数 4

三、__del__方法

3.1 题目

如何使用__del__方法

3.2 代码

class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print(f'我是{self.name},我被调用了')

    def show_info(self):
        print(f'小猫的名字是:{self.name},小猫的年龄是:{self.age}岁')

    def __str__(self):
        return f'小猫的名字是_str:{self.name},小猫的年龄是:{self.age}'

    def __del__(self):
        print(f'{self.name}没了,给他处理后事')


blue_cat = Cat('小蓝', '3')
print('代码运行结束')

输出结果:
在这里插入图片描述

3.3 代码解释

这段代码定义了一个名为 Cat 的类,并创建了一个 Cat 类的实例 blue_cat

  1. 定义 Cat 类:
    • __init__ 方法:这是一个特殊的方法,每当创建 Cat 类的新实例时,Python会自动调用它。这个方法接收两个参数 nameage,并将它们分别赋值给实例变量 self.nameself.age。之后,它打印一条消息,表明实例已经被创建,并包含了实例的名字

    • show_info 方法:这个方法打印出 Cat 实例的信息,包括名字和年龄

    • __str__ 方法:这是一个特殊的方法,它定义了当调用 str() 函数或使用 print() 函数打印 Cat 实例时的字符串表示。这个方法返回一个格式化的字符串,包含了实例的名字和年龄

    • __del__ 方法:这是一个特殊的方法,它是类的析构器。当 Cat 实例被销毁(例如,当它的引用计数降到零)时,Python会调用这个方法。在这个方法中,打印了一条消息,表明实例即将被销毁,并包含了实例的名字

  2. 创建 Cat 类的实例 blue_cat
    • blue_cat = Cat('小蓝', '3'):这行代码创建了一个名为 blue_catCat 类实例,并传递了字符串 '小蓝' 和字符串 '3' 作为 nameage 参数。由于 __init__ 方法中有一条打印语句,因此会立即看到输出 “我是小蓝,我被调用了”
  3. 打印一条消息表明代码运行结束:
    • print('代码运行结束'):这行代码打印出 “代码运行结束”。这通常会在主程序执行完毕后立即发生

四、思考

4.1 __init__方法

在python中,__init__ 方法是一个特殊的方法,它是一个类的构造器方法,也就是说,每当创建类的新实例时,python都会自动调用它。__init__ 方法的目的是初始化新创建的对象的状态

4.1.1 语法

class MyClass:
    def __init__(self, param1, param2, ..., paramN):
        # 初始化代码

4.1.2 参数

  • self:代表类的实例本身,在创建实例时自动传递。通过 self,你可以设置对象属性或调用其他的方法
  • param1, param2, ..., paramN:这些是除了 self 之外传递给 __init__ 方法的参数。你可以根据需要传递任意数量的参数

4.1.3 用途

  • 初始化对象的属性
  • 执行任何创建对象时需要的设置

4.1.4 示例

class Cat:
    def __init__(self, name, age):
        self.name = name  # 初始化name属性
        self.age = age    # 初始化age属性
# 创建Cat类的实例
my_cat = Cat('Whiskers', 3)
print(my_cat.name)  # 输出: Whiskers
print(my_cat.age)   # 输出: 3

在这个例子中,__init__ 方法接受 nameage 两个参数,并将它们分别赋值给新创建的 Cat 实例的 nameage 属性

4.1.5 注意事项

  • __init__ 方法不应该有返回值
  • 如果你不显式定义 __init__ 方法,Python 会提供一个默认的构造器,它不接受任何参数,也不执行任何操作
  • __init__ 方法不能直接调用,它是在创建类的实例时由Python解释器自动调用的。
    下面是一个没有定义 __init__ 方法的类的例子:
class MyClass:
    pass
obj = MyClass()  # 创建实例,没有 __init__ 方法被调用

在这个例子中,MyClass 没有定义 __init__ 方法,但是仍然可以创建它的实例。因为没有初始化逻辑,所以这个对象除了继承自 object 的属性外,没有其他属性

4.2 __str__方法

在python中,__str__ 方法是一个特殊的方法,它定义了类的实例在被打印(使用 print() 函数)或被转换为字符串(使用 str() 函数)时的“官方”字符串表示形式。
当定义一个类时,如果想要控制打印这个类的实例时的输出,应该在类中定义一个 __str__ 方法

4.2.1 一个包含 __str__ 方法的简单类的例子

class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f'小猫的名字是:{self.name}, 小猫的年龄是:{self.age}岁'
# 创建Cat类的实例
my_cat = Cat('Tom', 3)
# 打印实例,将调用__str__方法
print(my_cat)  # 输出: 小猫的名字是:Tom, 小猫的年龄是:3岁

在这个例子中,当使用 print(my_cat) 时,python会调用 my_cat 实例的 __str__ 方法来获取要打印的字符串。如果没有定义 __str__ 方法,print() 函数会调用 __repr__ 方法(如果定义了的话),否则会打印出对象的内存地址

4.2.2 __str__方法的一些规则

  • __str__ 方法应该返回一个字符串
  • 如果没有定义 __str__ 方法,类的实例在打印时将显示其内存地址
  • __str__ 方法的目的是为了创建一个对用户友好的、可读性强的字符串表示形式
  • __repr__ 方法通常用于创建一个明确的、尽可能不模糊的对象表示形式,通常可以用 eval(repr(obj)) 来重新创建对象,而 __str__ 不需要满足这个条件
    为了更好的实践,通常建议同时定义 __str____repr__ 方法,其中 __str__ 提供更友好的输出,而 __repr__ 提供一个明确的对象表示

4.3 __del__方法

4.3.1 为什么“代码执行结束”在del方法前打印

在python中,print 调用的执行顺序遵循代码的顺序。以下是代码执行的步骤:

  1. 定义了 Cat 类,其中包括 __init__show_info__str____del__ 方法
  2. 创建 Cat 类的实例 blue_cat,这时 __init__ 方法被调用,打印出 “我是小蓝,我被调用了”
  3. __init__ 方法执行完毕后,控制流返回到创建实例之后的代码行,即 print('代码运行结束'),这条语句被打印出来
  4. 程序接近尾声,由于没有更多的代码行,Python解释器开始进行垃圾回收,此时如果 blue_cat 实例没有其他引用,__del__ 方法将被调用,打印出 “小蓝没了,给他处理后事”
    看到 “代码运行结束” 在 __del__ 方法打印的 “小蓝没了,给他处理后事” 之前,是因为 print('代码运行结束') 这行代码在创建实例之后立即执行,而 __del__ 方法则在解释器清理对象时执行,这通常发生在程序即将退出时

请注意,__del__ 方法的调用时机是不确定的,它依赖于python的垃圾回收机制。在某些情况下,可能不会看到 __del__ 方法打印的消息,特别是如果程序在 __del__ 被调用之前就已经退出了。如果想在程序结束前确保看到 __del__ 的输出,可以显式调用 del blue_cat 来删除实例

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

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

相关文章

C# HttpClient请求URL重定向后丢失Authorization认证头信息 .Net Core Web Api

问题: 使用.Net 入库Doris请求FE端口后,FE响应重定向到其他BE节点出现的认证失败问题。 搜查官方文档后发现: HttpWebRequest.AllowAutoRedirect Property (System.Net) | Microsoft Learn 微软提供的http类库HttpClient (HttpWebRequest\WebClient已不…

springboot校园交友平台

基于springbootvue实现的校园交友平台 (源码L文ppt)4-082 第四章 系统设计 4.1 系统总体设计 系统的建设可以为校园交友管理提供帮助,通过对一些基础信息管理实现针对性的安排,可以按照用户的角色权限使不同用户角色看…

鲁大师2024年电动车Q3季报:九号E150 MK2刷新榜单,小牛极核发力智能驾辅赛道

鲁大师2024年Q3季报正式发布,本次季报包含电动车智能排行,测试的车型为市面上主流品牌的主流车型,共计18款,全部按照评测维度更广、更专业的鲁大师电动车智慧评测2.0进行评分,测试的成绩均来自于鲁大师智慧硬件实验室。…

ai美女一天涨粉过万日入过千?

我们先看看现阶段的美女视频已经可以达到系统无法识别ai的程度了 1、ai生成高拟真美女图片 我们打开鲸歌ai助手,选择ai绘画,输入以下提示词:一个亚洲面孔美女网红,白色T恤,牛仔短裙,手机相片,…

YOLO11涨点优化:注意力魔改 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

💡💡💡本文改进内容: BiLevelRoutingAttention方法对小目标检测效果比较好。可能是因为BRA模块是基于稀疏采样而不是下采样,一来可以保留细粒度的细节信息,二来同样可以达到节省计算量的目的。 💡💡💡本文改进:分别加入到YOLO11的backbone、neck、detect,助力…

ggshield:查找并修复基础设施即代码错误配置和硬编码密钥

关于ggshield ggshield是一款针对基础设施及代码的安全检测工具,该工具支持查找并修复 400 多种类型的硬编码敏感数据和 70 多种类型的基础设施即代码配置错误。 ggshield是一个在你的本地环境或 CI 环境中运行的 CLI 应用程序,可帮助你检测 400 多种类…

【JAVA开源】基于Vue和SpringBoot的知识管理系统

本文项目编号 T 074 ,文末自助获取源码 \color{red}{T074,文末自助获取源码} T074,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Android 带你玩转单元测试

前言 为什么要用到单元测试呢,一般开发谁会写单元测试,反正我认识的人都不会做,又耗时间,效果又一般,要是在单元测试的代码里面又出BUG的话又要改半天,麻烦。 但是有的时候真的是不得不用,比如…

YOLOv10改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv10目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注…

【科研日常】2024年计算图形学与多媒体CCF A、B类会议投稿截止日期汇总

整理了2024年多媒体方向的CCFA、B类学术会议的截稿时间,文末附有按月份排列的表格,各位同学可作为投稿参考。 A类会议 ACM MM 2024 ACM Multimedia 2024 Home (acmmm.org) Apr 8, 2024 SIGGRAPH 2024 Technical Papers | SIGGRAPH 2024 Jan 23, 202…

《深度学习》循环神经网络RNN 结构及原理解析

目录 一、关于RNN 1、传统神经网络存在的问题 2、什么是循环神经网络 3、RNN特点 二、RNN基本结构 1、RNN基本结构 2、推导方式 注意: 3、循环的由来 4、RNN的局限性 一、关于RNN 1、传统神经网络存在的问题 无法训练出具有顺序的数据,模型搭…

基于卷积神经网络的书法字体识别系统,resnet50,mobilenet模型【pytorch框架+python】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于卷积神经网络的书法字体识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili (一)简介 基于卷…

牛客——xay loves or与 __builtin_popcount的使用

xay loves or 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行思路 题目要求我们计算有多少个正整数 yy 满足条件 x \text{ OR } y sx OR ys。这里的“OR”是指按位或运算。为了理解这个问题,我们需要考虑按位或运算的性质。 对于任意两个位 a_iai​ 和 b_…

如何用AI绘画工具生成中国风插画?Midjourney保持风格一致出图

如何运用AI绘画工具如Midjourney,生成符合我们特定要求的艺术作品是一门精进的技巧,尤其当你想生成具有鲜明特色的国风插画时,纯文本提示词的局限性常常使我们难以达到预期效果。然而,借助Midjourney的高级参数功能——特别是sref…

中航资本:招保万金全跌停!“人气王”创历史,半日成交突破600亿

狂奔的“牛”总算迎来“回头”。 今日是新股民入市第一天。依据我国结算的安排,关于10月1日(周二)至10月8日(周二)提交请求的新开证券账户,于10月9日(周三)起可用于买卖。 不过&am…

GIS、向量、文字检索... 火山引擎 ByteHouse 集成全场景分析能力

企业业务场景增多、规模扩大,对于底层数据架构来说,可能也会愈加复杂。 比如,某企业因自身业务发展,需要引入向量检索能力,但前期选型的技术架构并不能直接支持,只能重新引入向量数据库。这意味着&#xff…

JavaWeb - 9 - MySQL

数据库:DataBase(DB),是存储和管理数据的仓库 数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件 SQL:Structured Query Language,操作关系型数据库的编程语言,定…

经纬恒润荣获2024中国汽车供应链大会创新成果奖

2024年9月24日-26日,2024中国汽车供应链大会暨第三届中国新能源智能网联汽车生态大会在武汉隆重举办。本届大会以“新挑战、新对策、新机遇——推动中国汽车供应链可持续发展”为主题,集聚政府主管领导、行业专家、汽车及零部件企业精英和主流媒体&#…

这个 JavaScript API 比你想象中更强大!

大家好,我是 ConardLi。 今天,我们来聊聊一个可能被你忽视,而且非常强大的标准 JavaScript API - AbortController 。 在过去,大家在提到 AbortController 的时候,一般会举请求中断的例子,就连 MDN 给到的…