Python中的Magic method
以首字母排序,记一下python中这些常见的magic method
Python 中的 "魔术方法"(magic methods),又称为特殊方法,是一组预定义的方法,它们以双下划线(__
)开始和结束。这些方法使得开发者能够对内建的 Python 行为进行自定义或扩展。实现这些方法有几个主要好处:
-
更自然的语言表达:魔术方法使得对象可以模拟内置类型的行为。例如,通过定义
__add__
方法,可以让自定义对象支持+
运算符。这使得代码更易读和更自然。 -
与 Python 的核心特性兼容:魔术方法使得自定义对象能够与 Python 的核心特性和语法结构兼容,比如迭代、上下文管理(with 语句)、数值运算等。
-
面向对象编程的增强:魔术方法提供了一种方式来实现面向对象的关键特性,如封装、继承和多态。
-
接口和抽象层的创建:通过定义魔术方法,可以创建符合特定接口或抽象层的类,这有助于构建更加模块化和可重用的代码。
-
操作重载(Operator Overloading):魔术方法使得开发者能够为自定义对象定义操作符的行为,这在创建数学或科学计算软件时尤其有用。
-
与 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