Python中的特殊方法是一类以双下划线(__)开头和结尾的方法,也称为魔术方法。这些方法在Python中具有特殊的用途和含义,可以让我们自定义类的行为和操作。

本文将介绍Python中的一些特殊方法及其用法。

__init__方法

__init__是Python中最常用的特殊方法之一,也被称为构造函数。当我们创建一个类的实例时,__init__方法会被自动调用,用于初始化对象的属性。

下面是一个简单的例子:

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

在这个例子中,__init__方法的作用是将name和age属性初始化为传入的参数。

__del__(self)方法

__del__方法用于定义对象的删除操作,在对象被删除时自动调用。

下面是一个例子:

class Person:
    def __del__(self):
        print("Person object deleted")

在这个例子中,__del__方法在对象被删除时打印一条消息。

__getitem__(self, key)方法

该方法在类中实现后,对象就可以像使用列表或字典一样使用下标或者键获取其中的元素了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __getitem__(self, key):
        return self.data[key]

my_obj = MyClass()
print(my_obj[0]) # 输出 1
print(my_obj[3]) # 输出 4

__setitem__(self, key, value)方法

该方法在类中实现后,对象就可以像使用列表或字典一样使用下标或者键设置其中的元素了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __setitem__(self, key, value):
        self.data[key] = value

my_obj = MyClass()
my_obj[2] = 6
print(my_obj.data) # 输出 [1, 2, 6, 4, 5]

__delitem__(self, key) 方法

__delitem__() 方法用于从对象中删除一个索引值。当你从对象中删除一个索引值时,Python 就会尝试调用该方法。你可以通过 key 参数来删除索引的值。

class MyList:
    def __init__(self, data):
        self.data = data
        
    def __delitem__(self, key):
        del self.data[key]

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

__len__(self)方法

该方法在类中实现后,对象就可以像使用len()函数一样使用len()获取其长度了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __len__(self):
        return len(self.data)

my_obj = MyClass()
print(len(my_obj)) # 输出 5

__str__(self)方法

该方法在类中实现后,可以通过str()函数或者print()函数输出对象时,自定义输出的字符串表示形式,例如:

class MyClass:
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return f"My name is {self.name}"

my_obj = MyClass("Tom")
print(str(my_obj)) # 输出 "My name is Tom"
print(my_obj) # 输出 "My name is Tom"

__repr__(self)方法

该方法与__str__(self)类似,不同的是,它在对象被打印时,如果没有定义__str__(self)方法,或者使用repr()函数调用对象时,就会输出该方法返回的字符串表示形式,例如:

class MyClass:
    def __init__(self, name):
        self.name = name
    
    def __repr__(self):
        return f"MyClass({self.name})"

my_obj = MyClass("Tom")
print(repr(my_obj)) # 输出 "MyClass(Tom)"
print(my_obj) # 输出 "MyClass(Tom)"

__call__方法

__call__方法用于将对象当作函数调用。

class Adder:
    def __call__(self, a, b):
        return a + b

在这个例子中,Adder对象可以像函数一样调用,返回两个数的和:

>>> adder = Adder()
>>> adder(1, 2)
3

以下是 Python 官方文档中列出的常见特殊方法(魔术方法):

  1. __init__(self[, ...]): 构造函数,在对象创建时被调用。
  2. __del__(self): 析构函数,在对象销毁时被调用。
  3. __repr__(self): 用于计算对象的“官方”字符串表示形式。
  4. __str__(self): 用于计算对象的“非正式”或“用户友好”字符串表示形式。
  5. __bytes__(self): 用于计算对象的二进制形式表示。
  6. __format__(self, format_spec): 用于格式化对象的字符串表示形式。
  7. __lt__(self, other): 用于“小于”比较。
  8. __le__(self, other): 用于“小于等于”比较。
  9. __eq__(self, other): 用于“等于”比较。
  10. __ne__(self, other): 用于“不等于”比较。
  11. __gt__(self, other): 用于“大于”比较。
  12. __ge__(self, other): 用于“大于等于”比较。
  13. __hash__(self): 用于计算对象的哈希值。
  14. __bool__(self): 用于计算对象的布尔值。
  15. __len__(self): 用于计算对象的长度。
  16. __getitem__(self, key): 用于实现索引操作。
  17. __setitem__(self, key, value): 用于实现赋值操作。
  18. __delitem__(self, key): 用于实现删除操作。
  19. __iter__(self): 用于迭代对象。
  20. __reversed__(self): 用于反转对象。
  21. __contains__(self, item): 用于判断对象是否包含一个元素。
  22. __call__(self[, args...]): 用于使一个对象变成可调用的。
  23. __enter__(self): 用于进入上下文管理器。
  24. __exit__(self, exc_type, exc_value, traceback): 用于离开上下文管理器。
  25. __await__(self): 用于支持异步协议。
  26. __aiter__(self): 用于异步迭代。
  27. __anext__(self): 用于异步迭代器。
  28. __get__(self, instance, owner): 用于实现描述符。
  29. __set__(self, instance, value): 用于实现描述符。
  30. __delete__(self, instance): 用于实现描述符。

请注意,这些特殊方法可能会与一些标准库和第三方库中的其他函数和方法名称冲突。因此,建议在编写自己的代码时,尽量不要使用 Python 中已有的名称。