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。

相关推荐
见叶之秋19 分钟前
C++ 泛型世界的两块拼图:容器适配器与仿函数
java·开发语言
zhangrelay36 分钟前
用ROS2Lyrical实验报告册思路重做蓝桥云课ROS1实验并改进
linux·笔记·学习·ubuntu·机器人
逗脑IDE39 分钟前
零基础学ESP32:RFID无线射频卡——让ESP32拥有“刷卡“能力!
开发语言·网络·人工智能·python·esp32·硬件开发
小师兄吃牛肉42 分钟前
C语言篇:内联函数
c语言·开发语言
协皓家具1 小时前
2026年广州岛台吧台椅厂家有啥新变化
大数据·运维·python·devops
yuniko-n1 小时前
【Java】字符串相关坑点
java·开发语言·python
用户019027581611 小时前
如何用 Python 统计 A 股连续涨停(几连板)?
python
外收内放1 小时前
Python基础语法练习题(拓展1)
python·游戏
jimy11 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
H_unique1 小时前
Chat2Excel:接口自动化测试
python·测试工具·自动化