Python中的魔术方法(Magic Methods),也称为双下划线方法(Double underscore methods)或特殊方法(Special methods),是一些特殊的函数,它们以双下划线开头和结尾,并且具有特殊的行为和用途。这些魔术方法可以帮助我们自定义类的行为,使得我们的类可以像内置类型一样使用,例如可以进行算术运算、比较、迭代、索引等操作。
以下是一些常用的魔术方法:
-
__init__
: 类的构造函数,用于初始化对象的属性。 -
__str__
: 返回一个描述对象的字符串,通常用于打印对象的信息。 -
__repr__
: 返回一个能够用于重建对象的字符串,通常用于调试和序列化。 -
__len__
: 返回对象的长度,通常用于支持内置函数 len。 -
__getitem__
: 支持通过索引访问对象中的元素。 -
__setitem__
: 支持通过索引设置对象中的元素。 -
__delitem__
: 支持通过索引删除对象中的元素。 -
__contains__
: 支持使用 in 运算符检查对象是否包含某个元素。 -
__add__
: 支持使用 + 运算符进行对象之间的加法操作。 -
__sub__
: 支持使用 - 运算符进行对象之间的减法操作。 -
__mul__
: 支持使用 * 运算符进行对象之间的乘法操作。 -
__truediv__
: 支持使用 / 运算符进行对象之间的除法操作。 -
__floordiv__
: 支持使用 // 运算符进行对象之间的整除操作。 -
__mod__
: 支持使用 % 运算符进行对象之间的取模操作。 -
__lt__
: 支持使用 < 运算符进行对象之间的小于比较。 -
__le__
: 支持使用 <= 运算符进行对象之间的小于等于比较。 -
__eq__
: 支持使用 == 运算符进行对象之间的相等比较。 -
__ne__
: 支持使用 != 运算符进行对象之间的不等比较。 -
__gt__
: 支持使用 > 运算符进行对象之间的大于比较。 -
__ge__
: 支持使用 >= 运算符进行对象之间的大于等于比较。 -
__iter__
: 返回一个迭代器,使得对象可以被遍历。 -
__next__
: 返回下一个迭代器元素,通常与 iter 配合使用。 -
__enter__
: 进入上下文管理器时调用的方法,通常与 with 语句一起使用。 -
__exit__
: 退出上下文管理器时调用
# __init__示例
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(1, 2)
print(p.x, p.y) # 输出: 1 2
# __str__和__repr__示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} is {self.age} years old"
def __repr__(self):
return f"Person('{self.name}', {self.age})"
p = Person("Alice", 25)
print(str(p)) # 输出: Alice is 25 years old
print(repr(p)) # 输出: Person('Alice', 25)
# __len__示例
class MyList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
l = MyList([1, 2, 3, 4])
print(len(l)) # 输出: 4
# __getitem__和__setitem__示例
class MyList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
def __setitem__(self, index, value):
self.items[index] = value
l = MyList([1, 2, 3, 4])
print(l[2]) # 输出: 3
l[2] = 5
print(l[2]) # 输出: 5
# __contains__示例
class MyList:
def __init__(self, items):
self.items = items
def __contains__(self, item):
return item in self.items
l = MyList([1, 2, 3, 4])
print(2 in l) # 输出: True
print(5 in l) # 输出: False
# __add__示例
class MyList:
def __init__(self, items):
self.items = items
def __add__(self, other):
return MyList(self.items + other.items)
l1 = MyList([1, 2, 3])
l2 = MyList([4, 5, 6])
l3 = l1 + l2
print(l3.items) # 输出: [1, 2, 3, 4, 5, 6]
# __lt__和__eq__示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
def __eq__(self, other):
return self.age == other.age
p1 = Person("Alice", 25)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)
print(p1 < p2) # 输出: True
print(p1 == p3) # 输出: True
# __iter__和__next__示例
class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start >= self.end:
raise StopIteration
value = self.start
self.start += 1
return value
r = MyRange(0, 5)
for i in r:
print(i) # 输出: 0 1 2 3 4
# __enter__和__exit__示例
class DatabaseConnection:
def __init__(self, db_url):
self.db_url = db_url
def __enter__(self):
self.connection = open(self.db_url)
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
self.connection.close()
# 使用 with 语句打开数据库连接,并在结束时自动关闭连接
with DatabaseConnection('example.db') as conn:
# 执行一些操作
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
print(rows)
网友评论