import json# ========== Mixin 定义 ==========class IterableMixin: ”””让容器可迭代、可求长度””” def __iter__(self): return iter(self._data) def __len__(self): return len(self._data) def __getitem__(self, index): return self._data[index]class FilterableMixin: ”””提供过滤功能””” def filter(self, predicate): ”””返回满足条件的元素列表””” return [item for item in self._data if predicate(item)] def first(self, predicate=None): ”””返回第一个满足条件的元素,无则 None””” for item in self._data: if predicate is None or predicate(item): return item return Noneclass SerializableMixin: ”””提供 JSON 序列化功能””” def to_json(self): return json.dumps(self._data, ensure_ascii=False, default=str) @classmethod def from_json(cls, json_str): data = json.loads(json_str) return cls(data)# ========== 组合 Mixin 的数据容器 ==========class DataContainer(IterableMixin, FilterableMixin, SerializableMixin): def __init__(self, data=None): self._data = list(data) if data else [] def add(self, item): self._data.append(item) return self# 链式调用 def __repr__(self): return f”DataContainer({self._data})”# ========== 鸭子类型:不继承任何东西 ==========class FakeContainer: ”””不继承任何 Mixin,但实现了 __iter__ 和 __len__””” def __init__(self, data): self._items = data def __iter__(self): return iter(self._items) def __len__(self): return len(self._items)# ========== 鸭子类型函数 ==========def process(container): ”””处理任何「可迭代且有长度」的对象——不看出身,看能力””” print(f” 类型:{container.__class__.__name__}”) print(f” 长度:{len(container)}”) print(f” 内容:{list(container)}”) print()# ========== 测试 ==========# DataContainer:拥有所有 Mixin 能力dc = DataContainer([1, 2, 3, 4, 5, 6, 7, 8])dc.add(9).add(10)# 链式调用print(”=== DataContainer 测试 ===”)print(f”repr: {dc}”)print(f”长度: {len(dc)}”)print(f”索引 [3]: {dc[3]}”)print(f”迭代: {[x for x in dc]}”)print(f”过滤偶数: {dc.filter(lambda x: x % 2 == 0)}”)print(f”第一个 >5: {dc.first(lambda x: x > 5)}”)# 序列化json_str = dc.to_json()print(f”to_json: {json_str}”)dc2 = DataContainer.from_json(json_str)print(f”from_json: {dc2}”)print()# FakeContainer:没有继承任何 Mixinprint(”=== 鸭子类型测试 ===”)fake = FakeContainer([”a”, ”b”, ”c”])print(”处理 DataContainer:”)process(dc)print(”处理 FakeContainer:”)process(fake)print(”处理普通列表:”)process([10, 20, 30])
=== DataContainer 测试 ===repr: DataContainer([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])长度: 10索引 [3]: 4迭代: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]过滤偶数: [2, 4, 6, 8, 10]第一个 >5: 6to_json: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]from_json: DataContainer([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])=== 鸭子类型测试 ===处理 DataContainer: 类型:DataContainer 长度:10 内容:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]处理 FakeContainer: 类型:FakeContainer 长度:3 内容:['a', 'b', 'c']处理普通列表: 类型:list 长度:3 内容:[10, 20, 30]