Backend Development 11 min read

Python Magic Methods: A Comprehensive Guide

This article introduces Python's magic methods, explaining their roles in object-oriented programming, including __init__, __str__, __len__, and more, with practical code examples and outputs.

Test Development Learning Exchange
Test Development Learning Exchange
Test Development Learning Exchange
Python Magic Methods: A Comprehensive Guide

前言

Python中的魔法方法(或称为特殊方法)是指那些名字以双下划线__开头和结尾的方法。这些方法定义了类的行为,使我们能够更加灵活地控制类的实例化过程、比较操作、运算符重载等。本文将介绍并展示10个常用的魔法方法。

1. __init__ 和 __new__

说明:

__init__ 是一个初始化方法,在创建新实例后立即被调用,用于设置初始状态。

__new__ 是一个构造器,负责创建实例本身。在__init__之前被调用,通常用于控制对象的创建过程,如单例模式。

示例代码:

class Person: def __init__(self, name, age): print("Initializing Person instance.") self.name = name self.age = age def __new__(cls, *args, **kwargs): print("Creating a new Person object.") return super().__new__(cls) p = Person("Alice", 30) print(p.name, p.age)

输出结果:

Creating a new Person object. Initializing Person instance. Alice 30

2. __str__ 和 __repr__

说明:

__str__ 方法定义了一个类的“用户友好”字符串表示形式,通常用于打印和显示。

__repr__ 方法定义了类的“官方”字符串表示形式,主要用于调试和开发。

示例代码:

class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"Person(name={self.name}, age={self.age})" def __repr__(self): return f"Person('" + self.name + "', " + str(self.age) + ")" p = Person("Bob", 25) print(str(p)) print(repr(p))

输出结果:

Person(name=Bob, age=25) Person('Bob', 25)

3. __len__

说明:

__len__ 方法定义了类的实例的长度,通常用于序列类型。

示例代码:

class MyList: def __init__(self, elements): self.elements = elements def __len__(self): return len(self.elements) ml = MyList([1, 2, 3, 4]) print(len(ml))

输出结果:

4

4. __getitem__ 和 __setitem__

说明:

__getitem__ 方法定义了索引获取操作的行为。

__setitem__ 方法定义了索引赋值操作的行为。

示例代码:

class MyList: def __init__(self, elements): self.elements = elements def __getitem__(self, index): return self.elements[index] def __setitem__(self, index, value): self.elements[index] = value ml = MyList([1, 2, 3, 4]) print(ml[1]) # Get item ml[1] = 10 # Set item print(ml[1])

输出结果:

2 10

5. __delitem__

说明:

__delitem__ 方法定义了删除索引操作的行为。

示例代码:

class MyList: def __init__(self, elements): self.elements = elements def __delitem__(self, index): del self.elements[index] ml = MyList([1, 2, 3, 4]) print(ml.elements) del ml[1] print(ml.elements)

输出结果:

[1, 2, 3, 4] [1, 3, 4]

6. __iter__ 和 __next__

说明:

__iter__ 方法定义了迭代器对象的获取行为。

__next__ 方法定义了迭代器的下一个元素的获取行为。

示例代码:

class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration result = self.data[self.index] self.index += 1 return result mi = MyIterator([1, 2, 3, 4]) for item in mi: print(item)

输出结果:

1 2 3 4

7. __eq__

说明:

__eq__ 方法定义了两个实例之间的等价性比较。

示例代码:

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

8. __lt__ 和 __gt__

说明:

__lt__ 方法定义了小于比较操作。

__gt__ 方法定义了大于比较操作。

示例代码:

class Point: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, other): return (self.x, self.y) < (other.x, other.y) def __gt__(self, other): return (self.x, self.y) > (other.x, other.y) p1 = Point(1, 2) p2 = Point(3, 4) print(p1 < p2) print(p1 > p2)

输出结果:

True False

9. __add__

说明:

__add__ 方法定义了加法操作。

示例代码:

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

10. __call__

说明:

__call__ 方法允许一个实例像函数一样被调用。

示例代码:

class Counter: def __init__(self): self.count = 0 def __call__(self): self.count += 1 return self.count counter = Counter() print(counter()) # First call print(counter()) # Second call

输出结果:

1 2

以上就是关于Python魔法方法的一些基本示例及其解释。这些魔法方法使得我们可以更灵活地定制Python类的行为,希望这些示例能够帮助您更好地理解和使用它们。

ProgrammingTutorialoopMagic Methods
Test Development Learning Exchange
Written by

Test Development Learning Exchange

Test Development Learning Exchange

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.