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

# 常见特殊方法汇总

  • init (self [, …]): 构造函数,在对象创建时被调用。
  • del (self): 析构函数,在对象销毁时被调用。
  • repr (self): 用于计算对象的 “官方” 字符串表示形式。
  • str (self): 用于计算对象的 “非正式” 或 “用户友好” 字符串表示形式。
  • bytes (self): 用于计算对象的二进制形式表示。
  • format (self, format_spec): 用于格式化对象的字符串表示形式。
  • lt (self, other): 用于 “小于” 比较。
  • le (self, other): 用于 “小于等于” 比较。
  • eq (self, other): 用于 “等于” 比较。
  • ne (self, other): 用于 “不等于” 比较。
  • gt (self, other): 用于 “大于” 比较。
  • ge (self, other): 用于 “大于等于” 比较。
  • hash (self): 用于计算对象的哈希值。
  • bool (self): 用于计算对象的布尔值。
  • len (self): 用于计算对象的长度。
  • getitem (self, key): 用于实现索引操作。
  • setitem (self, key, value): 用于实现赋值操作。
  • delitem (self, key): 用于实现删除操作。
  • iter (self): 用于迭代对象。
  • reversed (self): 用于反转对象。
  • contains (self, item): 用于判断对象是否包含一个元素。
  • call (self [, args…]): 用于使一个对象变成可调用的。
  • enter (self): 用于进入上下文管理器。
  • exit (self, exc_type, exc_value, traceback): 用于离开上下文管理器。
  • await (self): 用于支持异步协议。
  • aiter (self): 用于异步迭代。
  • anext (self): 用于异步迭代器。
  • get (self, instance, owner): 用于实现描述符。
  • set (self, instance, value): 用于实现描述符。
  • delete (self, instance): 用于实现描述符。

# init (self, …) 方法

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

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
person = Person('Tom', 18)

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

# del (self) 方法

   __del__ 方法用于定义对象的删除操作,在对象被删除时自动调用。 Python 自带自动垃圾回收机制,一般情况下不需要手动调用该方法。

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

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

# getitem (self, index) 方法

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

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __getitem__(self, index):
        return self.data[index]
my_obj = MyClass()
print(my_obj[0]) # 输出 1
print(my_obj[3]) # 输出 4

# setitem (self, index, value) 方法

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

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __setitem__(self, index, value):
        self.data[index] = value
my_obj = MyClass()
my_obj[2] = 6
print(my_obj.data) # 输出 [1, 2, 6, 4, 5]

# delitem (self, index) 方法

   __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
更新于 阅读次数