Python小白学习教程从入门到入坑------第二十七课 魔法方法(语法进阶)

目录

一、什么是魔法方法?

二、常见的魔法方法

三、魔法方法&魔法属性

3.1 __doc__()

3.2 __module__()

3.3 __class__()

3.4 __str__()

3.5 __del__() 


一、什么是魔法方法?

在Python中,__xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数

在Python中,魔法方法(Magic Methods)也被称为双下方法(Dunder Methods),因为它们通常以两个下划线(__)开始和结束

这些方法是Python内置的特殊方法,用于定义对象的内置操作的行为

通过重写这些魔法方法,可以自定义对象的行为,使它们表现得像Python的内置类型一样

二、常见的魔法方法

1. __new__(): 在内存中为对象分配空间并返回对象的引用

2. __init__(): 初始化对象或给属性赋值(构造函数)

3. __doc__(): 类的描述信息

4. __module__(): 表示当前操作对象所在模块

5. __class__(): 表示当前操作对象所在的类

6. __str__(): 对象的描述信息

7. __del__(): 删除对象(析构函数)

8. __cal__(): 使一个实例对象成为一个可调用对象

9. __dict__() : 返回对象具有的属性和方法

三、魔法方法&魔法属性

3.1 __doc__()

__doc__:类、函数的描述信息

eg:

class Person(object):"""人类——类的描述信息"""    # 只能使用多行注释,单行注释无效pass
print(Person.__doc__)
# 人类——类的描述信息

3.2 __module__()

__module__():表述当前操作对象所在的模块

这个属性在动态导入模块、调试、或者当你需要基于对象的来源模块做一些处理时非常有用

例如,你可以通过检查 __module__ 属性来判断一个函数是从哪个模块导入的,或者是在当前脚本中定义的

下面是一个简单的例子来说明 __module__ 的用法:

# 假设这是在一个名为 mymodule.py 的文件中def my_function():passclass MyClass:pass# 在这个文件中,我们可以打印这些对象的 __module__ 属性
print(my_function.__module__)  # 输出: mymodule
print(MyClass.__module__)      # 输出: mymodule

如果你从另一个脚本中导入 mymodule 并访问这些函数或类,它们的 __module__ 属性仍然会指向定义它们的原始模块名 mymodule

# 在另一个脚本中
import mymoduleprint(mymodule.my_function.__module__)  # 输出: mymodule
print(mymodule.MyClass.__module__)      # 输出: mymodule

如果这个函数或类是在当前脚本中定义的(即不是从模块中导入的),那么它们的 __module__ 属性会是 '__main__'

# 在当前脚本中
def another_function():passprint(another_function.__module__)  # 输出: '__main__'

3.3 __class__()

__class__:表示当前操作对象所在的类

接下来我们举一个例子解释说明一下:

新建一个py文件,pytest2.py

class B:def funa(self):print("哈哈哈")

在另一个py文件中调用,选择在py10.py文件中调用,如下:

import pytest2
b = pytest2.B()
print(b)
b.funa()
print(b.__module__)   # 输出模块
print(b.__class__)    # 输出类# 输出内容:
# <pytest2.B object at 0x00000275E478FA08>
# 哈哈哈
# pytest2
# <class 'pytest2.B'>

3.4 __str__()

__str__():对象的描述信息

如果类中定义了此方法,那么在打印对象时,默认输出该方法的返回值,也就是打印方法中的return 的数据

注意:__str__() 必须返回一个字符串

在Python中,__str__() 是一个特殊方法(也称为魔术方法或双下方法),用于定义一个对象的“非正式”或可打印的字符串表示

当你尝试将一个对象转换为字符串(例如,使用 print() 函数或 str() 函数)时,Python 会自动调用该对象的 __str__() 方法

下面是一个简单的例子来解释 __str__() 方法的用法:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):# 返回一个字符串,描述了Person对象的属性return f"Person(name={self.name}, age={self.age})"# 创建一个Person类的实例
person1 = Person("Alice", 30)# 当我们尝试打印person1对象时,Python会调用它的__str__()方法
print(person1)  # 输出: Person(name=Alice, age=30)# 我们也可以直接使用str()函数来调用__str__()方法
person_str = str(person1)
print(person_str)  # 输出: Person(name=Alice, age=30)

在这个例子中,我们定义了一个名为 Person 的类,它有两个属性:name 和 age。我们还定义了一个 __str__() 方法,该方法返回一个字符串,描述了 Person 对象的这两个属性

当我们创建一个 Person 类的实例 person1 并尝试打印它时,Python 会自动调用 person1 的 __str__() 方法,并打印该方法返回的字符串

__str__() 方法的主要用途是提供一个清晰、易读的字符串表示,以便在调试、日志记录或向用户显示对象信息时使用

3.5 __del__() 

__del__() : 析构函数,在程序结束时会调用,或者在删除某个对象的时候也会被调用

这个方法的主要目的是允许对象在销毁前执行一些清理操作,比如关闭文件、释放资源等

然而,需要注意的是,__del__() 方法的调用并不是确定的,也不是立即发生的

Python的垃圾回收机制通过引用计数和循环检测来管理内存,当对象的引用计数降为零时,对象可能立即被销毁,也可能稍后被销毁,具体取决于垃圾回收器的运行时机

此外,__del__() 方法中的异常通常会被忽略,这意味着如果在 __del__() 方法中发生了异常,它不会被传播到外部。这可能会使得调试变得困难,因为异常不会显示在程序的正常错误处理流程中。

下面是一个简单的例子来解释 __del__() 方法的用法:

class MyClass:def __init__(self, name):self.name = nameprint(f"{self.name} has been created.")def __del__(self):print(f"{self.name} is being destroyed.")# 创建一个MyClass类的实例
obj = MyClass("MyObject")# 此时,obj的引用计数仍然大于0,所以__del__()方法不会被调用
# 我们可以显式地删除obj来触发__del__()方法(尽管这通常不是必要的,因为Python的垃圾回收器会自动处理)
del obj  # 输出: MyObject is being destroyed.# 然而,如果对象是通过其他方式被引用的(比如在一个列表中),那么仅仅删除一个引用并不会触发__del__()方法
# 直到所有引用都被删除,或者程序结束并且垃圾回收器运行,对象才会被销毁

在上面的例子中,当 obj 被创建时,__init__() 方法被调用,打印出创建信息

然后,当我们使用 del 语句删除 obj 时,__del__() 方法被调用,打印出销毁信息

但是,通常不建议在 __del__() 方法中做太多重要的清理工作,因为它们的执行是不确定的

相反,建议使用上下文管理器(通过实现 __enter__() 和 __exit__() 方法)或显式地关闭资源(比如使用 with 语句来管理文件或网络连接)。这些机制提供了更可靠和可预测的资源管理方式

今天的分享就到这里了,希望本文能够对大家有帮助~

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

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

相关文章

ML 系列:机器学习和深度学习的深层次总结( 19)— PMF、PDF、平均值、方差、标准差

一、说明 在概率和统计学中&#xff0c;了解结果是如何量化的至关重要。概率质量函数 &#xff08;PMF&#xff09; 和概率密度函数 &#xff08;PDF&#xff09; 是实现此目的的基本工具&#xff0c;每个函数都提供不同类型的数据&#xff1a;离散和连续数据。 二、PMF 的定义…

string模拟实现插入+删除

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 string模拟实现reserve 这里实现的是扩容 扩容这里是可以实现缩容&#xff0c;可以实现…

《JVM第8课》垃圾回收算法

文章目录 1.标记算法1.1 引用计数法1.2 可达性分析法 2.回收算法2.1 标记-清除算法&#xff08;Mark-Sweep&#xff09;2.2 复制算法&#xff08;Coping&#xff09;2.3 标记-整理算法&#xff08;Mark-Compact&#xff09; 3.三种垃圾回收算法的对比 为什么要进行垃圾回收&…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

全网最适合入门的面向对象编程教程:58 Python字符串与序列化-序列化Web对象的定义与实现

全网最适合入门的面向对象编程教程&#xff1a;58 Python 字符串与序列化-序列化 Web 对象的定义与实现 摘要&#xff1a; 如果我们要在不同的编程语言之间传递对象&#xff0c;就必须把对象序列化为标准格式&#xff0c;比如XML\YAML\JSON格式这种序列化Web对象。这种序列化W…

使用YOLO 模型进行线程安全推理

使用YOLO 模型进行线程安全推理 一、了解Python 线程二、共享模型实例的危险2.1 非线程安全示例&#xff1a;单个模型实例2.2 非线程安全示例&#xff1a;多个模型实例 三、线程安全推理3.1 线程安全示例 四、总结4.1 在Python 中运行多线程YOLO 模型推理的最佳实践是什么&…

每日一题|3255. 长度为 K 的子数组的能量值 II|递增序列、计数器

同昨天的解法一样&#xff0c;遍历一遍的同时&#xff0c;统计当前最长的子串长度&#xff0c;如果>k&#xff0c;则将子串开始位置处赋值子串当前位置元素的值。 class Solution:def resultsArray(self, nums: List[int], k: int) -> List[int]:res [-1] * (len(nums)…

金华迪加现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现

0x01 产品描述&#xff1a; ‌ 金华迪加现场大屏互动系统‌是由金华迪加网络科技有限公司开发的一款专注于增强活动现场互动性的系统。该系统设计用于提供高质量的现场互动体验&#xff0c;支持各种大型活动&#xff0c;如企业年会、产品发布会、展览展示等。其主要功能包…

【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存

目录 一、相关问题 1. HTTP请求常见的状态码和字段&#xff1f; &#xff08;1&#xff09;状态码 &#xff08;2&#xff09;字段 ① Host 字段 ② Content-length 字段 ③ Connection 字段 ④ Content-Type 字段 ⑤ Content-Encoding 字段 2. GET 和 POST 的区别&a…

Java学习Day60:微服务总结!(有经处无火,无火处无经)

1、技术版本 jdk&#xff1a;17及以上 -如果JDK8 springboot&#xff1a;3.1及其以上 -版本2.x springFramWork&#xff1a;6.0及其以上 -版本5.x springCloud&#xff1a;2022.0.5 -版本格林威治或者休斯顿 2、模拟springcloud 父模块指定父pom <parent><…

ThreadX在STM32上的移植:F1,F4通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…

UE5.4 PCG基础节点

Projection&#xff1a;投影。可以让撒点重新恢复到表面采样器的初始高度和旋转值。缩放保持不变 DensityFilter&#xff1a;密度过滤器 AttributeNoise&#xff1a;Attribute噪声 模式&#xff1a;设置。重新定义噪点分布为0-1 模式&#xff1a;加0或乘1的时候&#xff0…

STM32-PWR低功耗

一、概述 PWR&#xff08;Power Control&#xff09;电源控制&#xff0c;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能可编程电压监测&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上…

AI 证件照工具 HivisionIDPhotos

如何在 Linux 系统使用 Docker 在本地部署 HivisionIDPhotos&#xff0c;并结合路由侠内网穿透外网访问本地部署的 HivisionIDPhotos 。 第一步&#xff0c;本地部署安装 HivisionIDPhotos 1&#xff0c;检查 Docker 服务状态&#xff0c;确保 Docker 正常运行。 systemctl …

springboot - 定时任务

定时任务是企业级应用中的常见操作 定时任务是企业级开发中必不可少的组成部分&#xff0c;诸如长周期业务数据的计算&#xff0c;例如年度报表&#xff0c;诸如系统脏数据的处理&#xff0c;再比如系统性能监控报告&#xff0c;还有抢购类活动的商品上架&#xff0c;这些都离不…

pandas——对齐运算+函数应用

引言&#xff1a;对齐运算是数据清洗的重要过程&#xff0c;可以按索引对齐进行运算&#xff0c;如果没对齐的位置则补NaN&#xff0c;最后也可以填充NaN 一、Series的对齐运算 1.Series 按行、索引对齐 import pandas as pds1 pd.Series(range(10, 20), indexrange(10)) s2…

画动态爱心(Python-matplotlib)

介绍 氵而已 由于用的是 AI&#xff0c;注释得非常清楚&#xff0c;自己改改也可以用 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name 尝试1 |User Pfolg # 2024/11/05 22:45 import numpy as np import matplotlib.pyplot as plt import matplot…

学习threejs,将多个网格合并成一个网格

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Geometry 几何体1.2 …

对于一个需要渲染300帧的动画项目,云渲染要多久

探讨云渲染动画300帧需要多久的问题时&#xff0c;我们今天来从多个角度进行分析&#xff0c;对于一个需要渲染300帧的动画项目&#xff0c;传统的本地渲染方式可能会因为硬件限制而变得耗时且效率低下。幸运的是&#xff0c;【渲染101】云渲染技术的出现为这一问题提供了解决方…

系统上云-流量分析和链路分析

优质博文&#xff1a;IT-BLOG-CN 一、流量分析 【1】流量组成&#xff1a; 按协议划分&#xff0c;流量链路可分为HTTP、SOTP、QUIC三类。 HTTPSOTPQUIC场景所有HTTP请求&#xff0c;无固定场景国内外APP等海外APP端链路选择DNS/CDN(当前特指Akamai)APP端保底IP列表/动态IP下…