美文网首页
python魔术方法

python魔术方法

作者: 木火应 | 来源:发表于2023-05-03 15:58 被阅读0次

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)

相关文章

网友评论

      本文标题:python魔术方法

      本文链接:https://www.haomeiwen.com/subject/xultsdtx.html