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

