在 Python 中,类(class)是面向对象编程的核心概念。类中有一些特殊的方法(也称为魔术方法或双下划线方法),这些方法在特定情况下会被自动调用。以下是一些常见的特殊方法及其用法:
__init__
方法
__init__
方法是类的构造函数,用于在创建对象时初始化对象的属性。
用法:
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
# 创建对象时会自动调用 __init__ 方法
obj = MyClass("Alice", 30)
print(obj.name) # 输出: Alice
print(obj.age) # 输出: 30
__str__
方法
__str__
方法用于定义对象的字符串表示,当使用 print
函数或 str
函数时会调用这个方法。
用法:
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"MyClass(name={self.name}, age={self.age})"
obj = MyClass("Alice", 30)
print(obj) # 输出: MyClass(name=Alice, age=30)
__repr__
方法
__repr__
方法用于定义对象的官方字符串表示,通常用于调试和开发。当在解释器中直接输入对象名时会调用这个方法。
用法:
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"MyClass(name={self.name}, age={self.age})"
obj = MyClass("Alice", 30)
obj # 输出: MyClass(name=Alice, age=30)
__eq__
方法
__eq__
方法用于定义两个对象是否相等,当使用 ==
运算符时会调用这个方法。
用法:
class MyClass:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if isinstance(other, MyClass):
return self.name == other.name and self.age == other.age
return False
obj1 = MyClass("Alice", 30)
obj2 = MyClass("Alice", 30)
print(obj1 == obj2) # 输出: True
__len__
方法
__len__
方法用于定义对象的长度,当使用 len
函数时会调用这个方法。
用法:
class MyClass:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
obj = MyClass([1, 2, 3, 4])
print(len(obj)) # 输出: 4
__getitem__
方法
__getitem__
方法用于定义对象的索引访问,当使用 obj[key]
语法时会调用这个方法。
用法:
class MyClass:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
obj = MyClass([1, 2, 3, 4])
print(obj[2]) # 输出: 3
__setitem__
方法
__setitem__
方法用于定义对象的索引赋值,当使用 obj[key] = value
语法时会调用这个方法。
用法:
class MyClass:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
obj = MyClass([1, 2, 3, 4])
obj[2] = 10
print(obj.items) # 输出: [1, 2, 10, 4]
__delitem__
方法
__delitem__
方法用于定义对象的索引删除,当使用 del obj[key]
语法时会调用这个方法。
用法:
class MyClass:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
obj = MyClass([1, 2, 3, 4])
del obj[2]
print(obj.items) # 输出: [1, 2, 4]
如果一个类有多个属性,你可以在 __init__
方法中初始化这些属性,并在其他特殊方法中根据需要使用这些属性。以下是一个示例,展示了如何处理多个属性,并在不同的特殊方法中使用它们。
示例类:Person
假设有一个 Person
类,它有多个属性:name
、age
和 address
。下面展示如何在这个类中使用多个属性,并实现一些常见的特殊方法。
class Person:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
def __str__(self):
return f"Person(name={self.name}, age={self.age}, address={self.address})"
def __repr__(self):
return f"Person(name={self.name}, age={self.age}, address={self.address})"
def __eq__(self, other):
if isinstance(other, Person):
return (self.name == other.name and
self.age == other.age and
self.address == other.address)
return False
def __len__(self):
# 假设我们想要返回地址的长度
return len(self.address)
def __getitem__(self, key):
# 允许通过索引访问属性
if key == 'name':
return self.name
elif key == 'age':
return self.age
elif key == 'address':
return self.address
else:
raise KeyError(f"Key {key} not found")
def __setitem__(self, key, value):
# 允许通过索引设置属性
if key == 'name':
self.name = value
elif key == 'age':
self.age = value
elif key == 'address':
self.address = value
else:
raise KeyError(f"Key {key} not found")
def __delitem__(self, key):
# 允许通过索引删除属性
if key == 'name':
del self.name
elif key == 'age':
del self.age
elif key == 'address':
del self.address
else:
raise KeyError(f"Key {key} not found")
# 创建一个 Person 对象
person = Person("Alice", 30, "123 Main St")
# 使用 __str__ 方法
print(person) # 输出: Person(name=Alice, age=30, address=123 Main St)
# 使用 __repr__ 方法
print(repr(person)) # 输出: Person(name=Alice, age=30, address=123 Main St)
# 使用 __eq__ 方法
person2 = Person("Alice", 30, "123 Main St")
print(person == person2) # 输出: True
# 使用 __len__ 方法
print(len(person)) # 输出: 11 (因为地址 "123 Main St" 的长度是 11)
# 使用 __getitem__ 方法
print(person['name']) # 输出: Alice
print(person['age']) # 输出: 30
print(person['address']) # 输出: 123 Main St
# 使用 __setitem__ 方法
person['age'] = 31
print(person.age) # 输出: 31
# 使用 __delitem__ 方法
del person['address']
print(person) # 输出: Person(name=Alice, age=31, address=None)