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")