Python中的Magic method

以首字母排序,记一下python中这些常见的magic method

Python 中的 "魔术方法"(magic methods),又称为特殊方法,是一组预定义的方法,它们以双下划线(__)开始和结束。这些方法使得开发者能够对内建的 Python 行为进行自定义或扩展。实现这些方法有几个主要好处:

  1. 更自然的语言表达:魔术方法使得对象可以模拟内置类型的行为。例如,通过定义 __add__ 方法,可以让自定义对象支持 + 运算符。这使得代码更易读和更自然。

  2. 与 Python 的核心特性兼容:魔术方法使得自定义对象能够与 Python 的核心特性和语法结构兼容,比如迭代、上下文管理(with 语句)、数值运算等。

  3. 面向对象编程的增强:魔术方法提供了一种方式来实现面向对象的关键特性,如封装、继承和多态。

  4. 接口和抽象层的创建:通过定义魔术方法,可以创建符合特定接口或抽象层的类,这有助于构建更加模块化和可重用的代码。

  5. 操作重载(Operator Overloading):魔术方法使得开发者能够为自定义对象定义操作符的行为,这在创建数学或科学计算软件时尤其有用。

  6. 与 Python 内置函数和语法的无缝集成:许多魔术方法允许自定义对象与 Python 的内置函数(如 len()str())和语法结构(如 for 循环、if 语句)无缝集成。


 

__call__(self [, xxx] )

最重要的应该使得该类的实例对象变为可调用的,而不实现之前应该是不能被调用的。更具体的说,把实例对象当作一个函数了,可以接受参数,实现在call方法中的逻辑。

(未实现call时)

(实现call方法)

 总结:

1. 多了一个调用方法的路径,代码更简洁,可读性仁者见仁智者见智。(个人觉得《实例.方法名》更方便理解)

2. python 可调用对象: 可以通过内置函数callable来判断:print(callable(instance))   #  True


__getitem__(self [, xxx] )

当需要传参时可直接覆写call(),在这里需要使用索引运算符[ ],所以要用getitem[ ]。换句话说:mydict['name']大致等同于mydict.__getitem__('name')(记住,这里假设mydict是实例对象,调用时是[ ]而不是())

 总结:

1. 其实可以定义一个不是魔术方法的类方法,使用(类实例.方法名(传参))的形式一样能够达成,这里也是更简洁和规则的实现方式

2. 牢记这里的调用符号是[ ]而不是( )

3. python允许你将任何对象传递到索引器中:整型、切片、字符串等等


 __init__(self [, xxx] )

 

 

 

持续更新。。。

参考来源:

chatGPT4

call(): https://blog.51cto.com/u_15274944/2921682

getitem():https://www.perfcode.com/p/python-getitem.html

posted @ 2024-01-03 16:21  半度墨水  阅读(54)  评论(0编辑  收藏  举报
Live2D