Python的特殊方法
在 Python 中,特殊方法(也称为魔术方法或双下划线方法)是一种约定,用于自定义类的行为和操作,例如实例化、字符串表示、算术运算、容器操作等。这些方法的名称以双下划线 __
开头和结尾,例如 __init__
、__str__
、__add__
等。特殊方法使得用户自定义的类可以像内置类型一样使用,增强了类的灵活性和表现力。
以下是一些常用的特殊方法及其作用:
1. __init__
初始化方法,用于在创建对象时初始化对象的状态。在实例化对象时自动调用。
2. __str__
和 __repr__
用于返回对象的字符串表示,__str__
在 str()
函数和 print()
函数调用时自动触发,而 __repr__
在交互式环境和 repr()
函数中调用。
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyClass instance with value: {self.value}"
def __repr__(self):
return f"MyClass({self.value})"
obj = MyClass(10)
print(str(obj)) # 输出: MyClass instance with value: 10
print(repr(obj)) # 输出: MyClass(10)
3. __len__
返回对象的长度,通常用于容器类或者支持长度操作的类。
class MyList:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list)) # 输出: 5
4. __add__
和 __sub__
定义对象的加法和减法运算。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Point(self.x - other.x, self.y - other.y)
p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2 # 调用 __add__
print(p3.x, p3.y) # 输出: 4, 6
p4 = p2 - p1 # 调用 __sub__
print(p4.x, p4.y) # 输出: 2, 2
5. __iter__
和 __next__
用于迭代器的实现,支持对象迭代。
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
my_iter = MyIterator([1, 2, 3, 4, 5])
for num in my_iter:
print(num) # 输出: 1 2 3 4 5
6. __getattr__
和 __setattr__
用于获取和设置对象的属性。
class MyClass:
def __getattr__(self, attr):
print(f"Getting attribute: {attr}")
return 42 # 返回默认值
def __setattr__(self, attr, value):
print(f"Setting attribute: {attr} to {value}")
super().__setattr__(attr, value)
obj = MyClass()
print(obj.x) # 输出: Getting attribute: x 42
obj.y = 10 # 输出: Setting attribute: y to 10
总结
Python 的特殊方法使得用户自定义的类可以与内置类型一样使用,并且增加了类的灵活性和表现力。这些方法可以根据需要进行自定义,从而改变类的行为,使得类对象的使用更加方便和自然。