python类中 __开头的函数【魔法方法】

在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}

 

posted @ 2024-12-20 14:40  公子Learningcarer  阅读(10)  评论(0编辑  收藏  举报