概述
在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__()
,然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是在使用内置函数iter(x)来迭代对象x。
在Java中,并没有像Python那样简单的实现方式。如果要进行比较,你需要实现compare方法;如果想要生成特定的对象,必须编写适当的构造器方法;如果想要打印对象,就需要实现toString方法等等。此外,在Java中的魔术类或方法以及各种本地方法基本上是不允许我们修改的。因此,我们还是简单地看一下Python是如何调用的吧。
常用特殊方法及实现
下面将介绍一些常用特殊方法和实现。
__init__(self,...)
构造函数主要用于初始化对象的属性。通过在类中定义__init__方法,可以在创建对象时自动调用该方法来初始化对象的属性。在构造函数中,可以通过self参数来访问对象的属性和方法,并为其赋予初始值。构造函数在对象创建时只会被调用一次,可以在其中执行一些必要的初始化操作,以确保对象在创建后处于正确的状态。
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
person = Person('xiaoyu',18)
print(person.name) # 输出: xiaoyu
print(person.age) # 输出: 18
__str__(self)
返回对象的字符串表示,可通过print(obj)来调用。这个方法对于调试和输出对象信息非常有用,可以提供更友好和可读性更高的输出结果。通过实现__str__方法,我们可以轻松地控制对象的打印行为,使其更符合我们的需求和预期。
class Person:
def __init__(self,age):
self.name = name
self.age = age
def __str__(self):
return f"Person: {self.name},{self.age} years old"
person = Person('xiaoyu',18)
print(person) # 输出: Person: xiaoyu,18 years old
__repr__(self)
返回对象的可打印字符串表示,可通过obj来调用。与__str__
方法类似,__repr__
方法也用于提供对象的字符串表示,但它的目标是更加精确和完整地描述对象的内部状态和结构。
class Person:
def __init__(self,age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name},age={self.age})"
person = Person('xiaoyu',18)
print(person) # 输出: Person(name=xiaoyu,age=18)
__len__(self)
返回对象的长度,可通过len(obj)来调用。在Python中,len()函数通常用于获取容器对象的元素个数,比如列表、字符串、字典等。通过实现__len__
方法,我们可以自定义对象的长度,并使其适应于特定的应用场景。例如,如果我们定义了一个自定义的容器类,可以通过实现__len__
方法来返回容器中元素的个数。这样,我们就可以像对待其他内置容器一样,使用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,5]
print(len(my_list)) # 输出: 5
__getitem__(self,key)
获取对象的指定元素,可通过obj[key]来调用。并将键值key传递给它作为参数。
class MyList:
def __init__(self):
self.data = []
def __getitem__(self,key):
return self.data[key]
my_list = MyList()
my_list.data = [1,5]
print(my_list[2]) # 输出: 3
__setitem__(self,key,value)
设置对象的指定元素,通过重载该方法,可以实现通过obj[key] = value来调用该方法。
class MyList:
def __init__(self):
self.data = []
def __setitem__(self,value):
self.data[key] = value
my_list = MyList()
my_list.data = [1,5]
my_list[2] = 10
print(my_list.data) # 输出: [1,10,5]
__delitem__(self,key)
删除对象的指定元素,可通过del obj[key]来调用。当你想要从对象中删除特定的元素时,这个方法会非常有用。
class MyList:
def __init__(self):
self.data = []
def __delitem__(self,key):
del self.data[key]
my_list = MyList()
my_list.data = [1,5]
del my_list[2]
print(my_list.data) # 输出: [1,5]
__iter__(self)
返回一个可迭代对象,以便我们可以通过for item in obj的方式进行迭代。
class MyList:
def __init__(self):
self.data = []
def __iter__(self):
return iter(self.data)
my_list = MyList()
my_list.data = [1,5]
for item in my_list:
print(item) # 输出: 1 2 3 4 5
__next__(self)
返回迭代器的下一个元素,可通过next(obj)来调用。
class MyIterator:
def __init__(self):
self.data = [1,5]
self.index = 0
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
item = self.data[self.index]
self.index += 1
return item
my_iterator = MyIterator()
print(next(my_iterator)) # 输出: 1
print(next(my_iterator)) # 输出: 2
print(next(my_iterator)) # 输出: 3
__call__(self,...)
class MyFunc:
def __call__(self,x,y):
return x + y
my_func = MyFunc()
result = my_func(3,4)
print(result) # 输出: 7
__eq__(self,other)
判断对象是否相等,可通过obj == other来调用。在Java中如果判断对象引用的话,你也需要重写equals这个方法。
class Point:
def __init__(self,y):
self.x = x
self.y = y
def __eq__(self,other):
return self.x == other.x and self.y == other.y
point1 = Point(1,2)
point2 = Point(1,2)
print(point1 == point2) # 输出: True
__lt__(self,other)
判断对象是否小于另一个对象,可通过obj < other来调用。
class Point:
def __init__(self,y):
self.x = x
self.y = y
def __lt__(self,other):
return self.x < other.x and self.y < other.y
point1 = Point(1,2)
point2 = Point(3,4)
print(point1 < point2) # 输出: True
__gt__(self,other)
判断对象是否大于另一个对象,可通过obj > other来调用。
class Point:
def __init__(self,y):
self.x = x
self.y = y
def __gt__(self,other):
return self.x > other.x and self.y > other.y
point1 = Point(3,4)
point2 = Point(1,2)
print(point1 > point2) # 输出: True
__add__(self,other)
定义对象的加法操作,可通过obj + other来调用。这样的话,你也可以对对象进行进行运算操作了
class Vector:
def __init__(self,y):
self.x = x
self.y = y
def __add__(self,other):
return Vector(self.x + other.x,self.y + other.y)
vector1 = Vector(1,2)
vector2 = Vector(3,4)
result = vector1 + vector2
print(result.x,result.y) # 输出: 4 6
__sub__(self,other)
定义对象的减法操作,可通过obj - other来调用。
class Vector:
def __init__(self,y):
self.x = x
self.y = y
def __sub__(self,other):
return Vector(self.x - other.x,self.y - other.y)
vector1 = Vector(3,4)
vector2 = Vector(1,2)
result = vector1 - vector2
print(result.x,result.y) # 输出: 2 2
常用特殊(魔术)方法的汇总一览表
以下是20个常用的特殊方法及其调用方式的表格,再多的用到了我们在看一下就可以了,只要记住(__)这个下划线开头和结尾的方法就可。请看下表:
特殊方法 | 描述 | 调用方式 |
---|---|---|
__init__ @H_502_190@
| 初始化对象@H_502_190@ | obj = ClassName() @H_502_190@
|
__str__ @H_502_190@
| 返回对象的字符串表示@H_502_190@ | str(obj) @H_502_190@
|
__len__ @H_502_190@
| 返回对象的长度@H_502_190@ | len(obj) @H_502_190@
|
__getitem__ @H_502_190@
| 获取对象的元素@H_502_190@ | obj[index] @H_502_190@
|
__setitem__ @H_502_190@
| 设置对象的元素@H_502_190@ | obj[index] = value @H_502_190@
|
__delitem__ @H_502_190@
| 删除对象的元素@H_502_190@ | del obj[index] @H_502_190@
|
__contains__ @H_502_190@
| 判断对象是否包含某个元素@H_502_190@ | value in obj @H_502_190@
|
__add__ @H_502_190@
| 实现对象的加法@H_502_190@ | obj1 + obj2 @H_502_190@
|
__sub__ @H_502_190@
| 实现对象的减法@H_502_190@ | obj1 - obj2 @H_502_190@
|
__mul__ @H_502_190@
| 实现对象的乘法@H_502_190@ | obj1 * obj2 @H_502_190@
|
__div__ @H_502_190@
| 实现对象的除法@H_502_190@ | obj1 / obj2 @H_502_190@
|
__eq__ @H_502_190@
| 判断对象是否相等@H_502_190@ | obj1 == obj2 @H_502_190@
|
__ne__ @H_502_190@
| 判断对象是否不相等@H_502_190@ | obj1 != obj2 @H_502_190@
|
__lt__ @H_502_190@
| 判断对象是否小于@H_502_190@ | obj1 < obj2 @H_502_190@
|
__gt__ @H_502_190@
| 判断对象是否大于@H_502_190@ | obj1 > obj2 @H_502_190@
|
__le__ @H_502_190@
| 判断对象是否小于等于@H_502_190@ | obj1 <= obj2 @H_502_190@
|
__ge__ @H_502_190@
| 判断对象是否大于等于@H_502_190@ | obj1 >= obj2 @H_502_190@
|
__iter__ @H_502_190@
| 返回一个迭代器对象@H_502_190@ | iter(obj) @H_502_190@
|
__next__ @H_502_190@
| 返回迭代器的下一个元素@H_502_190@ | next(obj) @H_502_190@
|
__del__ @H_502_190@
| 对象销毁时调用@H_502_190@ | del obj @H_502_190@
|
__call__ @H_502_190@
| 将对象作为函数调用@H_502_190@ | obj() @H_502_190@
|
总结
Python中的特殊方法(魔术方法)是由Python解释器自动调用的,用于实现对象的特定功能。常用的特殊方法包括__init__
、__str__
、__repr__
、__len__
、__getitem__
、__setitem__
、__delitem__
、__iter__
、__next__
、__call__
等。通过实现这些特殊方法,我们可以自定义对象的行为,使其更加符合我们的需求和预期。这些特殊方法的调用方式也有所不同,可以通过内置函数、运算符、迭代等方式来调用。掌握了这些特殊方法的用法,可以提高我们在Python中编写类和对象的灵活性和可扩展性。