You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:23:21