如何让两个Python类共享同一个collections.Counter对象?
最Pythonic的实现方式
方案1:依赖注入(构造函数传入共享Counter)
这是最直观且契合Python设计哲学的实现方式——通过显式将同一个Counter实例传入两个类的构造函数,既实现了实例间的统计数据共享,又避免了全局变量的滥用。
代码实现:
from collections import Counter class Shapes: def __init__(self, shared_counter): self.c = shared_counter # 初始化自身专属统计项(仅当Counter中无对应键时设置) self.c.setdefault('rotate', 0) self.c.setdefault('translate', 0) def do_operation(self): self.c['operation'] += 1 def rotate(self): self.c['rotate'] += 1 class Tools: def __init__(self, shared_counter): self.c = shared_counter # 初始化自身专属统计项 self.c.setdefault('hammer', 0) self.c.setdefault('scissor', 0) def do_operation(self): self.c['operation'] += 1 def use_hammer(self): self.c['hammer'] += 1 # 使用示例 shared_counter = Counter(operation=0) # 初始化共享统计项 A = Shapes(shared_counter) B = Tools(shared_counter) print(shared_counter['operation']) # 输出: 0 A.do_operation() B.do_operation() print(shared_counter['operation']) # 输出: 2
方案2:工厂函数封装共享逻辑
如果想简化实例化流程,可以用工厂函数封装共享Counter的创建和类实例初始化:
def create_shared_stats_pair(): shared_counter = Counter( operation=0, rotate=0, translate=0, hammer=0, scissor=0 ) return Shapes(shared_counter), Tools(shared_counter) # 使用示例 A, B = create_shared_stats_pair() A.do_operation() B.do_operation() print(A.c['operation']) # 输出: 2
方案优势
- 显式优于隐式:依赖注入清晰展示了两个类实例的共享关系,代码可读性拉满。
- 无全局污染:Counter仅在需要共享的实例间传递,不会污染全局命名空间。
- 灵活性强:后续如果需要多组独立的共享统计(比如两组Shapes和Tools各用各的Counter),只需创建多个Counter实例分别传入即可,无需修改类结构。
内容的提问来源于stack exchange,提问作者Tripola
相关产品推荐
相关产品推荐

