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