本文解释了Python的魔术(Dunder)方法,使操作员超载和自定义对象行为。它详细介绍了常见方法,例如__ADD__,__STR__以及其他用于定义操作,字符串表示和比较的方法 什么是Python魔法方法(Dunder方法)? Python Magic方法,也称为Dunder方法(“双重下划线”方法的缩写),是以双重下划线( __ )启动和结尾的特殊方法。它们提供了一种根据内置操作员和功能来定制对象和类的行为的方法。这些方法不是由程序员直接调用的。取而代之的是,当在类的对象上执行某些操作时,Python解释器暗示它们。例如,当您使用两个对象一起使用 python运算符内部检查这些对象的类是否定义了__add__魔法方法。如果是这样,该方法被称为执行添加。否则,将升级TypeError 。这些方法允许您定义自定义类与Python的核心功能相互作用,从而使代码更加直观和Pythonic。它们从本质上扩展了内置运算符的功能和功能,可以与您自己的自定义数据结构无缝合作。 “ dunder”这个名字是一种口语化,源于其名称的双重下划线。 如何使用魔法方法在Python中过载操作员? Python中的操作员过载是通过使用特定魔术方法实现的。每个操作员都有一个相应的魔术方法,该方法定义了将其应用于自定义类的对象时的行为。例如: __add__(self, other) :超载 操作员。此方法将self (类的实例)和other (正在添加的对象)作为参数。它应该返回添加的结果。 __sub__(self, other) :超载-运算符。 __mul__(self, other) :超载*操作员。 __truediv__(self, other) :超载/运算符。 __floordiv__(self, other) :超载//操作员(地板部门)。 __mod__(self, other) :超载%操作员(modulo)。 __pow__(self, other) :超载**操作员(指数)。 __lt__(self, other) :超载 operator(小于)。 __le__(self, other) :超载 operator(小于或等于)。 __gt__(self, other) :超载>运算符(大于)。 __ge__(self, other) :超载>= operator(大于或等于)。 __eq__(self, other) :超载==运算符(等于)。 __ne__(self, other) :超载!= operator(不等于)。 例子: class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x other.x, self.y other.y) def __str__(self): return f"Vector({self.x}, {self.y})" v1 = Vector(1, 2) v2 = Vector(3, 4) v3 = v1 v2 print(v3) # Output: Vector(4, 6) 在此示例中, __add__方法超载 Vector对象的操作员。请注意,您通常需要定义用于完整运算符过载的add和radd方法。 RADD处理您的自定义对象位于操作员右侧的情况。其他操作员也存在类似的对。 面向对象的编程中Python魔法方法的常见用例是什么? 魔术方法对于建立强大和直观的类是至关重要的。以下是一些常见用例: 操作员超载:如上所述,这使您可以定义标准运营商如何与自定义对象一起使用。 字符串表示: __str__(self)和__repr__(self)控制对象在打印或转换为字符串时如何显示对象。 __str__应该提供用户友好的表示形式,而__repr__应该是明确的,适合调试。 迭代: __iter__(self)和__next__(self)允许您创建迭代的对象,从而可以在自定义类上使用for 。 上下文管理: __enter__(self)和__exit__(self)用于管理资源的with (例如,文件处理,数据库连接)。 属性访问: __getattr__(self, name)和__setattr__(self, name, value)允许您自定义访问和修改属性的方式。 比较:例如__eq__ , __lt__ , __gt__等方法,使您能够定义对象如何相互比较。 收集行为: __len__ , __getitem__ , __setitem__之类的方法允许您实现像列表,词典等行为的自定义集合。 哪些魔术方法对于创建具有直觉行为的自定义类是必不可少的? 尽管存在许多魔术方法,但有些方法对于创建行为良好的自定义类是更基本的: __init__(self, ...) :构造函数,初始化对象属性所必需的。 __str__(self)和/或__repr__(self) :提供对象的人类可读和明确的字符串表示形式。 __eq__(self, other) :对于定义班级对象之间的平等至关重要。 __len__(self) :如果您的班级表示一个集合,则必须使用len()函数。 这四个通常是以可预测且用户友好的方式进行自定义类行为所需的最低要求。添加其他魔术方法取决于您要实现的特定功能,但是这四个功能为在Python中创建精心设计的类提供了坚实的基础。