1、简介

Python作为一门灵活而强大的编程语言,提供了许多特殊的方法,被称为魔法函数(Magic methods)。这些魔法函数以双下划线开头和结尾,能够让我们自定义类的行为,使得Python更加灵活和易用。本文将详细介绍Python中的魔法函数,帮助读者理解其作用和用法。

1.1、什么是魔法函数?

魔法函数(Magic methods),也被称为特殊方法(Special methods)或双下划线方法(Dunder methods),是Python中的一种特殊的方法。它们以双下划线开头和结尾,例如__init____str____repr__等。

这些方法在类定义中具有特殊的含义,Python会在特定的情况下自动调用它们。通过实现这些魔法函数,我们可以自定义类的行为,使其具有更多的灵活性和功能。

魔法函数可以用于控制对象的创建与销毁、字符串表示、运算符重载、容器操作、属性访问等多种情况。例如,__init__方法用于初始化对象,在对象创建时被调用;__str__方法控制对象在被转换为字符串时的行为;__getitem____setitem__方法用于实现对象的索引操作等。

2、魔法函数分类

魔法函数可以分为几类,包括对象创建与销毁、字符串表示、运算符重载、容器操作等。每种类型的魔法函数都有特定的作用,下面我们将逐一介绍。

对象创建与销毁

  • __new__(cls, *args, **kwargs): 用于创建对象实例,在__init__之前调用。
  • __init__(self, *args, **kwargs): 对象初始化方法,在创建对象后立即调用。
  • __del__(self): 对象销毁方法,在对象被销毁时调用。

字符串表示

  • __str__(self): 控制对象转换为字符串的行为,通过str(object)print(object)调用。
  • __repr__(self): 控制对象转换为可供解释器读取的字符串的行为,通过repr(object)调用。

容器操作

  • __len__(self): 控制对象长度的行为,通过len(object)调用。
  • __getitem__(self, key): 控制对象索引操作的行为,通过object[key]调用。
  • __setitem__(self, key, value): 控制对象赋值操作的行为,通过object[key] = value调用。
  • __delitem__(self, key): 控制对象删除操作的行为,通过del object[key]调用。
  • __iter__(self): 返回一个迭代器对象,用于对象的迭代操作。

比较操作

  • __eq__(self, other): 控制对象相等性比较的行为,通过object1 == object2调用。
  • __ne__(self, other): 控制对象不等性比较的行为,通过object1 != object2调用。
  • __lt__(self, other): 控制对象小于比较的行为,通过object1 < object2调用。
  • __gt__(self, other): 控制对象大于比较的行为,通过object1 > object2调用。
  • __le__(self, other): 控制对象小于等于比较的行为,通过object1 <= object2调用。
  • __ge__(self, other): 控制对象大于等于比较的行为,通过object1 >= object2调用。

数值运算

  • __add__(self, other): 控制对象加法运算的行为,通过object1 + object2调用。
  • __sub__(self, other): 控制对象减法运算的行为,通过object1 - object2调用。
  • __mul__(self, other): 控制对象乘法运算的行为,通过object1 * object2调用。
  • __truediv__(self, other): 控制对象真除运算的行为,通过object1 / object2调用。
  • __floordiv__(self, other): 控制对象整除运算的行为,通过object1 // object2调用。
  • __mod__(self, other): 控制对象取模运算的行为,通过object1 % object2调用。
  • __pow__(self, other[, modulo]): 控制对象幂运算的行为,通过object1 ** object2调用。

属性访问

  • __getattr__(self, name): 控制对不存在的属性的访问。
  • __setattr__(self, name, value): 控制对属性的赋值操作。
  • __delattr__(self, name): 控制对属性的删除操作。

其他

  • __contains__(self, item): 控制对象成员关系测试的行为,通过item in object调用。
  • __call__(self, *args, **kwargs): 控制对象的调用行为,使对象可以像函数一样被调用。

这些是Python中常见的魔法函数,通过实现其中的一个或多个,我们可以对类的行为进行高度定制化。

3、重写魔法函数

除了使用Python提供的魔法函数默认功能外,我们还可以重写类的魔法函数,以实现特定的行为。

例如:重写__str__函数,但是里面只返回123,这样在print对象时,就会打印123,而不是对象的地址。

class MyClass:
def __str__(self):
return '123' obj = MyClass()
print(obj) # 输出: 123

4、总结

通过本文的介绍,相信你应该对Python中的魔法函数有了基础的了解。魔法函数为我们提供了丰富的功能和灵活的定制选项,使得我们能够更加轻松地编写出强大而优雅的Python代码,希望你能够通过本文的学习,更加熟练地运用魔法函数,提高自己的编程水平。

关注公众号【Python魔法师】,回复python 一起进群沟通交流~

推荐链接

详解Python魔法函数,__init__,__str__,__del__的更多相关文章

  1. python中魔法方法__init__,__str__,__del__的详细使用方法

    1. python中的魔法方法, 类似__init__, __str__等等,这些内置好的特定的方法进行特定的操作时会自动被调用 2. __init__的使用方法 class 类名(object):  ...

  2. 详解Python中的__init__和__new__(静态方法)

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...

  3. 详解Python中的__init__和__new__

    转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...

  4. 详解python中的__init__与__new__方法

    一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...

  5. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

  6. 详解python函数的参数

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  7. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  8. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  9. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

  10. 详解Python中re.sub--转载

    [背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...

随机推荐

  1. Gin CORS 跨域请求资源共享与中间件

    Gin CORS 跨域请求资源共享与中间件 目录 Gin CORS 跨域请求资源共享与中间件 一.同源策略 1.1 什么是浏览器的同源策略? 1.2 同源策略判依据 1.3 跨域问题三种解决方案 二. ...

  2. word文档删除空白页

    记住两个快捷键 CTRL+Backspace Shift+Backspace 鼠标箭头放在空白的页面 按住键盘上的快捷键 就可以成功删除了不要天天看营销号设置什么磅值,全选删除啥的 效果如下

  3. 基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地

    文心大模型,产业级知识增强大模型介绍 官网:https://wenxin.baidu.com/ 项目链接见文末 文心大模型开发套件ERNIEKit,面向NLP工程师,提供全流程大模型开发与部署工具集, ...

  4. C++ 实现的Ping类的封装

    Ping 使用 Internet 控制消息协议(ICMP)来测试主机之间的连接.当用户发送一个 ping 请求时,则对应的发送一个 ICMP Echo 请求消息到目标主机,并等待目标主机回复一个 IC ...

  5. 7.3 通过API枚举进程

    首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如P ...

  6. 9.0 Python 内置模块应用

    Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...

  7. Object.getOwnPropertyDescriptor()属性

    console.log(Object.getOwnPropertyDescriptor(person,'a')); // writable: 是否可以修改 // value: 对象值 // confi ...

  8. 将实体光盘制作成光盘映像iso文件

    春节假期整理历史物件时发现一些书籍的光盘,虽然买了多年但一直没有看过,因为自己在用的电脑都没有光驱.正好老爸的电脑是带光驱的,想着趁过节把这些光盘的内容读取出来存在NAS上方便后续使用. 使用Ultr ...

  9. XD刷机报错bad CRC

    测试需要,给一台1/4 rack的X8M HC刷机,使用oeda配置好的xml文件,执行命令列出本次刷机的所有步骤: [root@dbm11dbadm01 linux-x64]# ./install. ...

  10. ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记

    任务21:运行Consent Page 修改 Config.cs 中的 RequireConsent 为 true,这样登录的时候就会跳转到 Consent 页面 修改 ConsentControll ...