在Python中,魔法方法(Magic Methods)或双下划线方法(Dunder Methods)是一类特殊的方法,它们以双下划线(__
)开头和结尾。这些方法为对象提供了丰富的功能,允许你定义对象的内置操作行为,如初始化、比较、表示、数学运算等。
以下是一些常见的魔法方法及其用途,并附有相应的示例代码。
1. 初始化与销毁
__init__(self, ...)
用于对象的初始化
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(10)
print(obj.value) # 输出: 10
__del__(self)
用于对象的销毁,当对象不再被使用时调用(但不一定立即调用)。
class MyClass:
def __init__(self, value):
self.value = value
print(f"Object created with value: {value}")
def __del__(self):
print("Object destroyed")
obj = MyClass(10)
# 当obj超出作用域时,__del__方法会被调用(在某些情况下,如循环引用,可能不会立即调用)
2. 表示
__str__(self)
定义对象的字符串表示。
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyClass with value: {self.value}"
obj = MyClass(10)
print(obj) # 输出: MyClass with value: 10
__repr__(self)
定义对象的官方字符串表示,通常用于调试。
class MyClass:
def __init__(self, value):
self.value = value
def __repr__(self):
return f"MyClass({self.value})"
obj = MyClass(10)
print(obj) # 输出: MyClass(10)
3. 比较
__eq__(self, other)
定义对象的相等性比较。
class MyClass:
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, MyClass):
return self.value == other.value
return False
obj1 = MyClass(10)
obj2 = MyClass(10)
print(obj1 == obj2) # 输出: True
__lt__(self, other)
定义对象的小于比较。
class MyClass:
def __init__(self, value):
self.value = value
def __lt__(self, other):
if isinstance(other, MyClass):
return self.value < other.value
return NotImplemented
obj1 = MyClass(5)
obj2 = MyClass(10)
print(obj1 < obj2) # 输出: True
__le__(self, other)
用于定义对象的小于等于(<=
)比较行为。
class MyClass:
def __init__(self, value):
self.value = value
def __le__(self, other):
return self.value <= other.value
obj1 = MyClass(10)
obj2 = MyClass(10)
print(obj1 <= obj2) # 输出: True
__ne__(self, other)
用于定义对象的不等于(!=
)比较行为。
class MyClass:
def __init__(self, value):
self.value = value
def __ne__(self, other):
return self.value != other.value
obj1 = MyClass(10)
obj2 = MyClass(20)
print(obj1 != obj2) # 输出: True
__gt__(self, other)
用于定义对象的大于(>
)比较行为。
class MyClass:
def __init__(self, value):
self.value = value
def __gt__(self, other):
return self.value > other.value
obj1 = MyClass(20)
obj2 = MyClass(10)
print(obj1 > obj2) # 输出: True
__ge__(self, other)
用于定义对象的大于等于(>=
)比较行为。
class MyClass:
def __init__(self, value):
self.value = value
def __ge__(self, other):
return self.value >= other.value
obj1 = MyClass(20)
obj2 = MyClass(10)
print(obj1 >= obj2) # 输出: True
4. 数学运算
__add__(self, other)
定义对象的加法运算。
class MyClass:
def __init__(self, value):
self.value = value
def __add__(self, other):
if isinstance(other, MyClass):
return MyClass(self.value + other.value)
return NotImplemented
obj1 = MyClass(5)
obj2 = MyClass(10)
obj3 = obj1 + obj2
print(obj3.value) # 输出: 15
__mul__(self, other)
定义对象的乘法运算。
class MyClass:
def __init__(self, value):
self.value = value
def __mul__(self, other):
if isinstance(other, (int, float)):
return MyClass(self.value * other)
return NotImplemented
obj = MyClass(5)
obj2 = obj * 2
print(obj2.value) # 输出: 10
5. 容器类型
__len__(self)
定义对象的长度。
class MyClass:
def __init__(self, *values):
self.values = values
def __len__(self):
return len(self.values)
obj = MyClass(1, 2, 3, 4)
print(len(obj)) # 输出: 4
__getitem__(self, key)
定义对象的索引操作。
class MyClass:
def __init__(self, *values):
self.values = list(values)
def __getitem__(self, key):
return self.values[key]
obj = MyClass(1, 2, 3, 4)
print(obj[1]) # 输出: 2
__setitem__(self, key, value)
定义对象的索引赋值操作。
class MyClass:
def __init__(self, *values):
self.values = list(values)
def __setitem__(self, key, value):
self.values[key] = value
obj = MyClass(1, 2, 3, 4)
obj[1] = 20
print(obj.values) # 输出: [1, 20, 3, 4]
6. 可迭代与迭代器
__iter__(self)
定义对象的迭代器。
class MyClass:
def __init__(self, *values):
self.values = values
def __iter__(self):
self.index = 0
return self
def __next__(self):
if self.index < len(self.values):
result = self.values[self.index]
self.index += 1
return result
else:
raise StopIteration
obj = MyClass(1, 2, 3, 4)
for item in obj:
print(item) # 输出: 1, 2, 3, 4
7. 上下文管理
__enter__(self)
定义进入上下文管理器的行为。
__exit__(self, exc_type, exc_val, exc_tb)
定义退出上下文管理器的行为。
class MyClass:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # 如果返回True,则异常会被忽略
with MyClass():
print("Inside the context")
# 输出:
# Entering the context
# Inside the context
# Exiting the context
8. 返回值dict
__dict__
__dict__
是一个字典属性,它包含了对象及其类的所有属性和它们的值。这个属性对于动态地查看和修改对象的属性非常有用。
class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b
obj = MyClass(1, 2)
print(obj.__dict__) # 输出: {'a': 1, 'b': 2}
标签:__,python,self,value,other,def,MyClass,类中 From: https://www.cnblogs.com/wyj497022944/p/18619259