Python 魔法方法

Python中有许多特殊方法,也叫作”魔法方法”,用于定义类的行为。这些方法以双下划线开头和结尾,比如__init____str__等。这些方法可以让我们在类中定义一些特殊的行为,例如定制对象的字符串表示、比较对象、访问对象属性等。本文将详细介绍Python中常用的魔法方法。

1. __init__方法

__init__方法是最常用的魔法方法之一,用于初始化对象。当创建一个类的实例时,__init__方法会被调用,对对象进行初始化。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Alice", 30)
print(person.name)  # 输出 "Alice"
print(person.age)   # 输出 30

2. __str__方法

__str__方法用于定义对象的字符串表示。当使用print函数打印对象时,会调用__str__方法返回对象的字符串表示。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person: {self.name}, {self.age}"

person = Person("Bob", 25)
print(person)  # 输出 "Person: Bob, 25"

3. __eq__方法

__eq__方法用于定义对象的相等性。当使用==运算符比较两个对象时,会调用__eq__方法判断它们是否相等。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age

person1 = Person("Alice", 30)
person2 = Person("Alice", 30)
print(person1 == person2)  # 输出 True

4. __lt____gt__方法

__lt____gt__方法分别用于定义对象的小于和大于关系。当使用<>运算符比较两个对象时,会调用这两个方法。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age

    def __gt__(self, other):
        return self.age > other.age

person1 = Person("Bob", 25)
person2 = Person("Alice", 30)
print(person1 < person2)  # 输出 True
print(person1 > person2)  # 输出 False

5. __getitem____setitem__方法

__getitem____setitem__方法用于实现对象的索引访问和赋值。当对对象使用obj[key]语法时,会调用__getitem__方法获取元素,当对对象使用obj[key] = value语法时,会调用__setitem__方法赋值。

class MyList:
    def __init__(self):
        self.data = []

    def __getitem__(self, index):
        return self.data[index]

    def __setitem__(self, index, value):
        self.data[index] = value

my_list = MyList()
my_list.data = [1, 2, 3]
print(my_list[0])  # 输出 1
my_list[1] = 4
print(my_list.data)  # 输出 [1, 4, 3]

6. __len__方法

__len__方法用于返回对象的长度。当调用len(obj)函数时,会调用__len__方法返回对象的长度。

class MyList:
    def __init__(self):
        self.data = []

    def __len__(self):
        return len(self.data)

my_list = MyList()
my_list.data = [1, 2, 3, 4]
print(len(my_list))  # 输出 4

7. __call__方法

__call__方法使得对象可以像函数一样被调用。当对对象使用obj()语法时,会调用__call__方法执行对象的代码逻辑。

class Adder:
    def __init__(self, x):
        self.x = x

    def __call__(self, y):
        return self.x + y

adder = Adder(5)
result = adder(3)
print(result)  # 输出 8

总结

本文介绍了Python中常用的魔法方法,包括__init____str____eq____lt____gt____getitem____setitem____len____call__等。通过实现这些魔法方法,可以定制类的行为,使代码更加灵活和易读。