🧩 整合示例:一个自定义的 MyList
类(像列表一样的类)
python复制编辑class MyList:
def __init__(self, data):
# 构造方法
self.data = data
print("__init__ 被调用:初始化完成")
def __len__(self):
# 返回长度
return len(self.data)
def __getitem__(self, index):
# 获取指定下标的值
return self.data[index]
def __setitem__(self, index, value):
# 设置指定下标的值
self.data[index] = value
def __delitem__(self, index):
# 删除指定下标的值
del self.data[index]
def __iter__(self):
# 返回可迭代对象(比如 for 循环)
print("__iter__ 被调用")
return iter(self.data)
def __next__(self):
# (不常用,除非自己实现 iterator)这里不演示
# 运算符重载部分
def __add__(self, other):
# 加法重载
return MyList(self.data + other.data)
def __eq__(self, other):
# 比较是否相等
return self.data == other.data
def __str__(self):
# 字符串显示,用于 print()
return f"MyList: {self.data}"
def __repr__(self):
# 调试时的显示
return f"MyList({self.data})"
def __del__(self):
# 析构函数(对象销毁时调用)
print("__del__ 被调用,对象被销毁")
# 普通方法
def append(self, value):
self.data.append(value)
✅ 使用示例:逐个触发魔术方法
python复制编辑a = MyList([1, 2, 3]) # __init__
b = MyList([4, 5])
print(len(a)) # __len__ → 输出: 3
print(a[1]) # __getitem__ → 输出: 2
a[1] = 20 # __setitem__
del a[2] # __delitem__
for i in a: # __iter__
print(i) # 输出: 1, 20
print(a + b) # __add__ → 合并为新列表 [1, 20, 4, 5]
print(a == b) # __eq__ → 比较两个列表是否相等
print(str(a)) # __str__
print(repr(a)) # __repr__
a.append(99) # 普通方法调用 append()
📘 Java 思维下的类比
Python 魔术方法 | Java 类似操作 | 示例 |
---|---|---|
__init__ | 构造方法 | new MyList(...) |
__len__ | .size() | list.size() |
__getitem__ | .get(index) | list.get(1) |
__setitem__ | .set(index, value) | list.set(1, 20) |
__delitem__ | .remove(index) | list.remove(2) |
__iter__ | Iterable 接口 | for (int x : list) |
__add__ | 自定义类重载加法(Java 不支持) | listA + listB 不支持 |
__eq__ | .equals() | listA.equals(listB) |
__str__ | .toString() | System.out.println(obj) |
__repr__ | toString() for 调试 | IDE 输出对象信息 |
__del__ | 析构函数(不建议在 Java 用) | Java 用 finalize() |
🔚 总结图(最常用的魔术方法一览)
分类 | 魔术方法 | 用途/触发方式 |
---|---|---|
初始化 | __init__ | 创建对象时自动调用 |
销毁 | __del__ | 对象销毁时自动调用 |
长度相关 | __len__ | len(obj) |
下标访问 | __getitem__ | obj[i] |
下标赋值 | __setitem__ | obj[i] = val |
删除元素 | __delitem__ | del obj[i] |
可迭代 | __iter__ | for x in obj |
运算符重载 | __add__ | obj1 + obj2 |
比较 | __eq__ | obj1 == obj2 |
字符串表示 | __str__ | print(obj) |
调试表示 | __repr__ | obj 在控制台输出时使用 |
普通方法 | 任意 def | 直接调用:obj.method() |
你可以把这个类理解为:
Java 中一个实现了 List 接口、重写了
toString()
、equals()
、size()
、get()
、set()
、iterator()
的自定义类。