Python 中的Magic Method

Python 中的魔术方法(Magic Methods),也称为双下方法(Dunder Methods),是以双下划线 __ 开头和结尾的特殊方法。它们用于定义类的行为,使自定义类能够支持 Python 的内置操作(如加法、索引、迭代等)。以下是常见的魔术方法及其用途的分类和示例。

1. 对象创建和初始化

  • __new__:创建对象时调用,通常用于不可变类型的自定义行为。
  • __init__:初始化对象时调用,用于设置对象的初始状态。

示例:

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("Creating instance")
        instance = super().__new__(cls)
        return instance

    def __init__(self, value):
        print("Initializing instance")
        self.value = value

obj = MyClass(10)
# 输出:
# Creating instance
# Initializing instance

2. 字符串表示

  • __str__:定义对象的用户友好字符串表示(str(obj)print(obj) 时调用)。
  • __repr__:定义对象的官方字符串表示(repr(obj) 或交互式环境直接输出时调用)。

示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Point({self.x}, {self.y})"

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

p = Point(1, 2)
print(p)        # 输出: Point(1, 2)
print(repr(p))  # 输出: Point(x=1, y=2)

3. 比较操作

  • __eq__:定义 == 操作。
  • __ne__:定义 != 操作。
  • __lt__:定义 < 操作。
  • __le__:定义 <= 操作。
  • __gt__:定义 > 操作。
  • __ge__:定义 >= 操作。

示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)  # 输出: True

4. 算术操作

  • __add__:定义 + 操作。
  • __sub__:定义 - 操作。
  • __mul__:定义 * 操作。
  • __truediv__:定义 / 操作。
  • __floordiv__:定义 // 操作。
  • __mod__:定义 % 操作。
  • __pow__:定义 ** 操作。

示例:

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)

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3.x, v3.y)  # 输出: 4 6

5. 容器操作

  • __len__:定义 len(obj) 的行为。
  • __getitem__:定义 obj[key] 的行为。
  • __setitem__:定义 obj[key] = value 的行为。
  • __delitem__:定义 del obj[key] 的行为。
  • __contains__:定义 in 操作的行为。

示例:

class MyList:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

my_list = MyList([1, 2, 3])
print(len(my_list))  # 输出: 3
print(my_list[1])    # 输出: 2

6. 迭代操作

  • __iter__:定义迭代器的行为。
  • __next__:定义迭代器的下一个值。

示例:

class Counter:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        self.current += 1
        return self.current - 1

counter = Counter(1, 5)
for num in counter:
    print(num)
# 输出:
# 1
# 2
# 3
# 4

7. 上下文管理

  • __enter__:定义 with 语句进入时的行为。
  • __exit__:定义 with 语句退出时的行为。

示例:

class MyContextManager:
    def __enter__(self):
        print("Entering context")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting context")

with MyContextManager() as cm:
    print("Inside context")
# 输出:
# Entering context
# Inside context
# Exiting context

8. 调用对象

  • __call__:使对象可以像函数一样被调用。

示例:

class Adder:
    def __call__(self, a, b):
        return a + b

adder = Adder()
print(adder(1, 2))  # 输出: 3

9. 属性访问

  • __getattr__:定义访问不存在的属性时的行为。
  • __setattr__:定义设置属性时的行为。
  • __delattr__:定义删除属性时的行为。

示例:

class MyClass:
    def __getattr__(self, name):
        return f"Attribute {name} not found"

obj = MyClass()
print(obj.foo)  # 输出: Attribute foo not found

10. 其他常用魔术方法

  • __hash__:定义 hash(obj) 的行为。
  • __bool__:定义 bool(obj) 的行为。
  • __dir__:定义 dir(obj) 的行为。

总结

魔术方法是 Python 中强大且灵活的特性,通过实现这些方法,可以让自定义类支持 Python 的内置操作和行为。以下是一些关键点:

  • __init__ 用于初始化对象。
  • __str____repr__ 用于定义对象的字符串表示。
  • __eq____add__ 等用于定义比较和算术操作。
  • __len____getitem__ 等用于定义容器行为。
  • __iter____next__ 用于支持迭代。
进阶高级测试工程师 文章被收录于专栏

《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务