Python 魔术方法

1. 什么是魔术方法

在 Python 中,魔术方法 (Magic Methods),又叫 特殊方法双下方法 ,是以两个下划线(__)开头和结尾的方法。

这些方法为 Python 提供了对类和对象的特殊操作功能,它们通常是在特定事件发生时自动调用的。魔术方法允许程序员自定义对象的行为,使得对象能够参与到 Python 内置的操作中(如加法、比较、打印等),这些方法的自动触发和简洁的语法使得 Python 更加灵活和强大。

2. 魔术方法的特点

  1. 自动调用:魔术方法通常在特定操作或事件发生时自动调用。程序员不需要显式地调用这些方法。
  2. 双下划线命名 :魔术方法的名称以双下划线(__)开头和结尾。比如:__init____str____add__ 等。
  3. 自定义行为:魔术方法允许程序员定义对象在不同情境下的行为。例如,如何处理加法操作、如何表示对象的字符串输出、如何进行容器类型的索引访问等。

3. 常见的魔术方法

下面介绍 Python 中常见的魔术方法,它们的作用和示例。

  1. __init__(self, ...)

    • 作用__init__ 是 Python 的构造函数,用于初始化对象。当你创建一个对象时,Python 会自动调用这个方法来初始化对象的属性。可以将初始化所需的参数传递给 __init__ 方法。

    • 自动触发 :当你实例化(创建)一个对象时,__init__ 方法会被自动调用。

    • 示例

      python 复制代码
      class MyClass:
          def __init__(self, name):
              self.name = name
      
      obj = MyClass("Alice")  # 自动调用 __init__(self, "Alice")
      print(obj.name)  # 输出:Alice

      解析 :在这个例子中,当创建 MyClass 的实例时,__init__ 方法会自动被调用,name 属性被初始化为 "Alice"

  2. __str__(self)

    • 作用__str__ 定义了对象的字符串表示。当你使用 print() 函数打印一个对象,或者使用 str() 函数时,Python 会自动调用 __str__ 方法。

    • 自动触发 :当你打印对象或将对象转换为字符串时,Python 会自动调用 __str__ 方法,返回一个表示对象的字符串。

    • 示例

      python 复制代码
      class Person:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def __str__(self):
              return f"{self.name}, {self.age} years old"
      
      person = Person("Alice", 30)
      print(person)  # 自动调用 __str__,输出 "Alice, 30 years old"

      解析 :当 print(person) 被执行时,Python 会自动调用 __str__ 方法,返回 "Alice, 30 years old" 字符串作为对象的表示。

  3. __repr__(self)

    • 作用__repr__ 方法用于定义对象的"机器表示"。它应该返回一个字符串,通常这个字符串可以用来重新创建该对象(即能通过 eval() 还原对象)。通常用于调试和开发环境。

    • 自动触发 :当你使用 repr() 函数,或者在交互式环境中查看对象时,Python 会自动调用 __repr__ 方法。

    • 示例

      python 复制代码
      class Person:
          def __init__(self, name, age):
              self.name = name
              self.age = age
      
          def __repr__(self):
              return f"Person('{self.name}', {self.age})"
      
      person = Person("Alice", 30)
      print(repr(person))  # 输出 "Person('Alice', 30)"

      解析__repr__ 返回一个可以表示该对象的字符串。在调试时,你可以通过 repr(person) 来查看该对象的内部表示。

  4. __add__(self, other) --- 加法运算符重载

    • 作用__add__ 是加法运算符的重载方法,当你使用 + 运算符时,Python 会自动调用 __add__ 方法。

    • 自动触发 :当你使用加法运算符(+)对对象进行操作时,__add__ 方法会被自动调用。

    • 示例

      python 复制代码
      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 __repr__(self):
              return f"Vector({self.x}, {self.y})"
      
      v1 = Vector(1, 2)
      v2 = Vector(3, 4)
      print(v1 + v2)  # 自动调用 __add__,输出 Vector(4, 6)

      解析 :在这个例子中,当你使用 v1 + v2 时,Python 会自动调用 v1.__add__(v2),返回一个新的 Vector(4, 6) 对象。

  5. __len__(self)

    • 作用__len__ 定义了对象的长度行为,当你调用 len() 函数时,Python 会自动调用 __len__ 方法。

    • 自动触发 :当你使用 len() 函数时,__len__ 方法会被自动调用。

    • 示例

      python 复制代码
      class MyList:
          def __init__(self, items):
              self.items = items
      
          def __len__(self):
              return len(self.items)
      
      my_list = MyList([1, 2, 3])
      print(len(my_list))  # 自动调用 __len__,输出 3

      解析__len__ 方法返回了列表 items 的长度,因此当你调用 len(my_list) 时,Python 会自动调用 my_list.__len__()

  6. __getitem__(self, key) --- 获取元素

    • 作用__getitem__ 用于定义对象的索引行为。当你通过 obj[key] 访问对象时,Python 会自动调用 __getitem__ 方法。

    • 自动触发 :当你使用索引语法([])来访问对象时,Python 会自动调用 __getitem__ 方法。

    • 示例

      python 复制代码
      class MyList:
          def __init__(self, items):
              self.items = items
      
          def __getitem__(self, index):
              return self.items[index]
      
      my_list = MyList([10, 20, 30])
      print(my_list[1])  # 自动调用 __getitem__(1),输出 20

      解析 :通过 my_list[1] 访问时,Python 自动调用 my_list.__getitem__(1),返回索引位置为 1 的值 20

  7. __setitem__(self, key, value)

    • 作用__setitem__ 用于定义对象的索引赋值行为,当你通过 obj[key] = value 赋值时,Python 会自动调用 __setitem__ 方法。

    • 自动触发 :当你使用索引赋值([] =)语法时,Python 会自动调用 __setitem__ 方法。

    • 示例

      python 复制代码
      class MyList:
          def __init__(self, items):
              self.items = items
      
          def __setitem__(self, index, value):
              self.items[index] = value
      
      my_list = MyList([10, 20, 30])
      my_list[1] = 50  # 自动调用 __setitem__(1, 50)
      print(my_list.items)  # 输出 [10, 50, 30]

      解析 :通过 my_list[1] = 50 赋值时,Python 自动调用 my_list.__setitem__(1, 50),更新索引 1 处的值为 50。

相关推荐
岑梓铭10 分钟前
考研408《计算机组成原理》复习笔记,第五章(2)——CPU指令执行过程
笔记·考研·408·计算机组成原理·计组
fantasy_arch39 分钟前
pytorch例子计算两张图相似度
人工智能·pytorch·python
七七&5561 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
java坤坤1 小时前
GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
开发语言·后端·golang
元清加油1 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
健康平安的活着2 小时前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
WBluuue2 小时前
数学建模:智能优化算法
python·机器学习·数学建模·爬山算法·启发式算法·聚类·模拟退火算法
赴3353 小时前
矿物分类案列 (一)六种方法对数据的填充
人工智能·python·机器学习·分类·数据挖掘·sklearn·矿物分类
大模型真好玩3 小时前
一文深度解析OpenAI近期发布系列大模型:意欲一统大模型江湖?
人工智能·python·mcp
RPA+AI十二工作室3 小时前
亚马逊店铺绩效巡检_影刀RPA源码解读
chrome·python·rpa·影刀