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__
方法的作用是将 name
和 age
属性初始化为传入的参数。
# 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 |