Python魔法函数(Magic Methods简介

在 Python 中,魔法函数(Magic Methods)也称为双下划线方法(Dunder Methods),是指那些名字以双下划线开头和结尾的特殊方法。 这些方法可以让您的自定义类实现一些特定的行为,从而与 Python 的内置类型和操作进行交互。

例如,`__init__` 方法用于对象的初始化,`__str__` 方法用于定义对象的字符串表示形式,`__add__` 方法用于实现对象的加法操作等。

以下是一些常见魔法函数的示例及其作用:

1. `__init__`:在创建对象时自动调用,用于初始化对象的属性。 

class MyClass:
    def __init__(self, value):
        self.value = value

 例子:创建“Student”类,对应逻辑关系:

Student→self→{name,age,grade}(三个逻辑分支)

# 创建学生对象
student1 = Student("Alice", 12, 6)
#类的实例化
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade

# 创建学生对象
student1 = Student("Alice", 12, 6)
print(student1.name)  
print(student1.age)  
print(student1.grade)  

 

2. `__str__`:定义对象的字符串表示,当使用 `str()` 函数或在打印对象时调用。

class MyClass:
    def __str__(self):
        return f"MyClass with value: {self.value}"

例子:

class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"My value is {self.value}"

my_object = MyClass(42)
print(str(my_object))  

在这段代码中,`42` 这个值的传递关系如下: 当创建对象 `my_object = MyClass(42)` 时,`42` 作为参数被传递给了 `MyClass` 类的 `__init__` 方法。 在 `__init__` 方法内部,`42` 被赋值给了对象的 `self.value` 属性,使得该对象具有了 `value` 属性且其值为 `42` 。 当执行 `str(my_object)` 或 `print(my_object)` 时,会调用 `__str__` 方法,在 `__str__` 方法中通过 `self.value` 访问到了之前存储的 `42` 值,并将其用于生成返回的字符串 `My value is 42` 。 简单来说,`42` 从创建对象时作为参数传入,被存储在对象的属性中,然后在需要时被 `__str__` 方法获取并使用。  

3. `__add__`:实现对象的加法操作。

class MyNumber:
    def __init__(self, num):
        self.num = num

    def __add__(self, other):
        return MyNumber(self.num + other.num)

例子:

class MyNumber:
    def __init__(self, num):
        self.num = num

    def __add__(self, other):
        return MyNumber(self.num + other.num)

num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.num)  

 

4. `__len__`:用于 `len()` 函数获取对象的长度。

class MyList:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

例子:

class MyList:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  

通过合理地定义魔法函数,可以使自定义类的行为更加自然和符合 Python 的习惯用法。

以下是一些常见的 Python 魔法函数及它们的作用:

1. `__init__(self,...)`:对象初始化函数,在创建对象时调用,用于进行对象的初始化操作。

2. `__str__(self)`:直接打印对象的实现方法,被`print`函数调用,返回对象的字符串表示。

3. `__new__(cls, *args, **kwargs)`:在对象实例化时首先被调用,用于创建并返回实例对象。

4. `__unicode__(self)`:在一个对象上调用`unicode()`时被调用,常用于 Django 模型中处理字符串。

5. `__call__(self, *args, **kwargs)`:允许一个类的实例像函数一样被调用。

6. `__len__(self)`:定义当被`len()`调用时的行为,需要返回一个整数,表示对象的长度。

7. `__repr__(self)`:用于将值转化为供解释器读取的形式,如果对象没有适于人阅读的解释形式,`str()`会返回与`repr()`相同的内容。

8. `__setattr__(self, name, value)`:可以设置对象的属性。

9. `__getattr__(self, name)`:获取对象属性,在属性没有找到时被调用。

10. `__getattribute__(self, name)`:无条件地获取对象属性,可用于做一些控制,但定义后`__getattr__`不再自动调用,除非显式调用。

11. `__delattr__(self, name)`:用于删除对象的属性。

12. `__setitem__(self, key, value)`:实现该函数后,可以以下标的方式给对象赋值。

13. `__getitem__(self, key)`:可以使对象支持以下标的方式获取值。

14. `__delitem__(self, key)`:支持以下标方式删除对象数据。

15. `__iter__(self)`:只要定义了该方法,对象就可以使用迭代器访问,意味着可以迭代自定义的对象。

16. `__del__(self)`:析构器或回收器,在对象引用数降到 0 时执行,但执行时间可能不确定,一般不推荐使用,可用于实现一些非紧急但必须要做的事。

17. `__eq__(self, other)`:定义等于号的行为,用于判断两个对象是否相等。

18. `__lt__(self, other)`:定义小于号的行为,用于判断一个对象是否小于另一个对象。

19. `__gt__(self, other)`:定义大于号的行为,用于判断一个对象是否大于另一个对象。

20. `__add__(self, other)`:定义加法操作的行为。

21. `__sub__(self, other)`:定义减法操作的行为。

22. `__mul__(self, other)`:定义乘法操作的行为。

23. `__truediv__(self, other)`:定义真除法操作的行为。

24. `__floordiv__(self, other)`:定义整数除法操作的行为。

25. `__mod__(self, other)`:定义取模算法的行为。

26. `__pow__(self, other, modulo)`:定义当被`power()`调用或 `**` 运算时的行为。

27. `__radd__(self, other)`等(反运算魔法方法):当左操作数不支持相应的操作时被调用,例如`__radd__`在执行`other + self`时被调用。

28. `__iadd__(self, other)`等(增量赋值运算魔法方法):定义相应的增量赋值运算行为,如`__iadd__`定义`+=`的行为。

29. `__neg__(self)`:定义正号的行为。

30. `__pos__(self)`:定义负号的行为。

31. `__abs__(self)`:定义当被`abs()`调用时的行为。

32. `__invert__(self)`:定义按位求反的行为。

33. `__complex__(self)`:定义当被`complex()`调用时的行为,需要返回恰当的值。

34. `__int__(self)`:定义当被`int()`调用时的行为,需要返回恰当的值。

35. `__float__(self)`:定义当被`float()`调用时的行为,需要返回恰当的值。

36. `__round__(self, n)`:定义当被`round()`调用时的行为,需要返回恰当的值。

37. `__index__(self)`:当对象应用在切片表达式中时,实现强制转换;如果定义了该方法,则也需要定义`__int__`且返回相同的值。

魔法函数可以让自定义类具有更丰富的行为,类似于 Python 内置类型的操作方式,从而使代码更加简洁、易读和可维护。它们的具体使用方式和效果取决于具体的需求和上下文。在实际编程中,根据需要选择合适的魔法函数来定制类的行为。

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

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

相关文章

warning: GOPATH set to GOROOT (D:\go) has no effect

warning: GOPATH set to GOROOT (D:\go) has no effect gopath 设置一下,并且不要和 goroot 设置成同一个目录

【carla】ubuntu安装carla环境

我们可以通过查看 CARLA 的 GitHub release 页面来找到最新版本的下载链接。 下载 CARLA 压缩包 访问 CARLA Releases 页面: CARLA Releases on GitHub 查找最新版本: 找到最新的版本,点击下载,第一个压缩包 3. 解压 CARLA 包&…

在先企业字号被申请注册成商标!

今天一网友联系普推商标知产老杨,说自己注册的商标被某公司无效宣告了,去年联系老杨时,当时就给说这个商标名称存在风险,与别人的字号权存在高度近似,而且是同行业同地区在后面注册的。 十几年前某公司先成功注册成字号…

AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界

AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界 MetaGPT 以一条需求作为输入,并输出用户故事/竞争分析/需求/数据结构/API/文档等。内部而言,MetaGPT 包含产品经理/架构师/项目经理/工程师等角色。它为软件…

树目标、抓过程、要结果

一个好的管理理念不会因为一两个成功案例而发扬,一定是有无数个案例验证了它的价值所在,既然OKR在国外已经取得成功,那么国内依然如此。那么OKR这么成功,它到底好在哪呢? 一、OKR是连接企业战略和落地执行的最佳方式。…

ftp服务

1.什么是FTP FTP(文件传输协议)是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。FTP客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。tcp协议&a…

1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 —— 《带你自学大语言模型》系列

本系列目录 《带你自学大语言模型》系列部分目录及计划,完整版目录见:带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型(科普向) 第一章 走进大语言模型 1.1 从图灵机到GPT,人工智能经历了什么&#xff1…

【3GPP核心网】【5G】精讲5G核心网系统架构主要特征

目录 前言 1. 5G核心网系统架构主要特征 1.1 5G核心网与4G核心网EPC区别 1.2 5G核心网系统架构主要特征 2. 5G网络逻辑架构 2.1 新型基础设施平台 2.2 逻辑架构 前言 首先需要理解核心网的角色定位,作为移动通信网络的核心部分,核心网起着承上启下的作用…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点:安装配置Hadoop 重 点: 安装配置Hadoop 难 点:无 内 容: Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威…

JS进阶-作用域

学习目标: 掌握作用域 学习内容: 作用域局部作用域全局作用域作用域链JS垃圾回收机制拓展-JS垃圾回收机制-算法说明闭包变量提升 作用域: 作用域规定了变量能够被访问的"范围",离开了这个"范围"变量便不能被…

批量爬取B站网络视频信息

使用XPath爬取B站视频链接等相关信息 分析B站html框架获取内容完整代码 对于B站,目前网上的爬虫大多都是使用通过解析服务器的响应来爬取想要的内容,下面我们通过使用XPath来爬取B站上一些想要的信息 此次任务我们需要对B站搜索到的关键字,并…

本地多卡(3090)部署通义千问Qwen2-72B大模型提速实践:从龟速到够用

最近在做文本风格转化,涉及千万token级别的文本。想用大模型转写,在线的模型一来涉及数据隐私,二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限,正好实验室给俺配了4卡3090的机子,反正也就是做个推理&#…

Python falsk 接口挂载 步骤

Python falsk 接口挂载 步骤 1.首先要有自己独立的python环境,因为如果和别人共用环境的话,会有依赖包冲突的情况 2.找到python.exe的安装路径 3.CMD切换到该路径下 4.执行指令activate,进入到专属的python环境 5.然后执行指令 pip freeze > re.tet…

CentOS 7遗忘了root密码怎么办?

正文共:666 字 12 图,预估阅读时间:1 分钟 说来也巧,突然发现使用KVM在部署CentOS时(笔记本电脑安装CentOS系统),会有一个神奇的现象,还不是偶然出现的,在最近的三四次部…

【ComfyUI节点】扰动注意力引导Perturbed Attention Guidance

扰动注意力引导 Perturbed Attention Guidance GitHub - KU-CVLAB/Perturbed-Attention-Guidance: Official implementation of "Perturbed-Attention Guidance" 按照官方介绍,扰动注意力指导显著提高了扩散模型的样本质量,而无需外部条件&am…

测试用例编写与管理流程

hello,大家好,我是一名测试开发工程师,至今已在自动化测试领域深耕9个年头,现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦,在接下来的一个月里,我将免费指导大家使用wyTest,请大家…

14-Django项目--文件上传-Excel

目录 前端 路由 视图函数 前端 <div class"modal-body"><form method"post" enctype"multipart/form-data" action"/pretty/asset/">{% csrf_token %}<input type"file" name"excel"><bu…

Leetcode3194. 最小元素和最大元素的最小平均值

Every day a Leetcode 题目来源&#xff1a;3194. 最小元素和最大元素的最小平均值 解法1&#xff1a;排序遍历 将数组 nums 排序后&#xff0c;利用双指针计算每一对 (minElement maxElement) / 2&#xff0c;最小值即为答案。 代码&#xff1a; /** lc appleetcode.cn …

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

AI 大模型系统实战

AI 大模型是什么&#xff1f; 维基百科对基础模型的定义是这样的&#xff0c;基础模型是一种大型机器学习模型&#xff0c;通常在大量数据上进行大规模训练&#xff08;通过自监督学习或半监督学习&#xff09;&#xff0c;以使它可以适应各类下游任务。因此&#xff0c;它需要…