Python中的魔术方法是指以双下划线 __ 开头和结尾的特殊方法,也被称为特殊方法或魔术方法。这些方法在类中具有特殊的用途,它们可以让你自定义类的行为,使得你的对象可以像内置类型一样工作。这些方法由解释器调用,而不是你直接调用它们。例如,当你使用 + 运算符时,实际上是调用了对象的 __add__ 方法。这些方法允许你重载运算符、改变对象的构造和初始化行为、自定义属性访问等等。使用魔术方法可以使你的代码更具表现力、可读性和灵活性。
Python 3.8.6中的一些常见魔术方法包括:
__init__: 对象初始化方法,在创建对象时调用。__repr__: 返回对象的“官方”字符串表示形式。__str__: 返回对象的“非正式”或友好字符串表示形式。__len__: 返回对象的长度。__getitem__: 获取对象中指定键的值。__setitem__: 设置对象中指定键的值。__delitem__: 删除对象中指定键的值。__iter__: 返回一个迭代器对象。__contains__: 检查对象是否包含指定的元素。__call__: 实例对象作为函数调用时调用。__eq__: 定义对象的相等性。__lt__,__le__,__gt__,__ge__: 定义对象的比较行为。__add__,__sub__,__mul__,__truediv__,__floordiv__,__mod__: 定义对象的算术运算。__getattr__,__setattr__,__delattr__: 处理对象属性的获取、设置和删除。__enter__,__exit__: 定义在使用with语句时对象的上下文管理行为。
以下是每个魔术方法的详细解释和示例代码:
__init__
初始化方法,在创建对象时调用。通常用于初始化对象的属性。
class MyClass: def __init__(self, x): self.x = x obj = MyClass(5) print(obj.x) # 输出: 5
__repr__
返回对象的“官方”字符串表示形式。通常用于开发者。
class MyClass: def __repr__(self): return 'MyClass()' obj = MyClass() print(repr(obj)) # 输出: MyClass()
__str__
返回对象的“非正式”或友好字符串表示形式。通常用于用户。
class MyClass: def __str__(self): return 'MyClass instance' obj = MyClass() print(str(obj)) # 输出: MyClass instance
__len__
返回对象的长度。
class MyList: def __init__(self, data): self.data = data def __len__(self): return len(self.data) my_list = MyList([1, 2, 3, 4, 5]) print(len(my_list)) # 输出: 5
__getitem__
获取对象中指定键的值。
class MyDict: def __init__(self, data): self.data = data def __getitem__(self, key): return self.data[key] my_dict = MyDict({'a': 1, 'b': 2}) print(my_dict['a']) # 输出: 1
__setitem__
设置对象中指定键的值。
class MyDict: def __init__(self): self.data = {} def __setitem__(self, key, value): self.data[key] = value my_dict = MyDict() my_dict['a'] = 1 print(my_dict['a']) # 输出: 1
__delitem__
删除对象中指定键的值。
class MyDict: def __init__(self): self.data = {'a': 1, 'b': 2} def __delitem__(self, key): del self.data[key] my_dict = MyDict() del my_dict['a'] print(my_dict.data) # 输出: {'b': 2}
__iter__
返回一个迭代器对象。
class MyIterable: def __iter__(self): return iter([1, 2, 3, 4, 5]) obj = MyIterable() for item in obj: print(item) # 输出: 1 2 3 4 5
__contains__
检查对象是否包含指定的元素。
class MyList: def __init__(self, data): self.data = data def __contains__(self, item): return item in self.data my_list = MyList([1, 2, 3, 4, 5]) print(3 in my_list) # 输出: True
__call__
实例对象作为函数调用时调用。
class MyCallable: def __call__(self, x): return x * 2 obj = MyCallable() print(obj(5)) # 输出: 10
__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
__lt__, __le__, __gt__, __ge__
定义对象的比较行为。
class Point: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, other): return self.x < other.x and self.y < other.y p1 = Point(1, 2) p2 = Point(2, 3) print(p1 < p2) # 输出: True
__add__, __sub__, __mul__, __truediv__, __floordiv__, __mod__
定义对象的算术运算。
class MyNumber: def __init__(self, value): self.value = value def __add__(self, other): return self.value + other.value a = MyNumber(5) b = MyNumber(3) print(a + b) # 输出: 8
__getattr__, __setattr__, __delattr__
处理对象属性的获取、设置和删除。
class MyObject: def __init__(self): self.data = {} def __getattr__(self, name): return self.data.get(name) def __setattr__(self, name, value): self.data[name] = value def __delattr__(self, name): del self.data[name] obj = MyObject() obj.name = 'Alice' print(obj.name) # 输出: Alice
__enter__, __exit__
定义在使用 with 语句时对象的上下文管理行为。
class MyResource: def __enter__(self): print("Entering context") return self def __exit__(self, exc_type, exc_value, traceback): print("Exiting context") with MyResource() as res: print("Doing something inside the context")