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

Python如何为类字节属性添加单位转换能力实现链式调用

实现方案

核心思路是单独封装一个字节值包装类,把所有单位转换逻辑统一收敛在这个类中,所有存储字节数的计数器属性只需要返回这个包装类的实例,即可自动获得全量单位转换能力,无需为每个计数器单独编写转换方法。

第一步:定义字节值包装类

这个类负责存储原始字节数值,同时通过属性暴露所有需要的单位转换结果:

class ByteValue:
    __slots__ = ('_raw_bytes',)  # 可选,用于减少实例内存占用
    def __init__(self, raw_bytes: int | float):
        self._raw_bytes = raw_bytes

    # 原始字节值
    @property
    def bytes(self) -> float:
        return self._raw_bytes

    # 千字节,默认按二进制换算,如需十进制换算把1024改成1000即可
    @property
    def kbytes(self) -> float:
        return self._raw_bytes / 1024

    # 兆字节
    @property
    def mbytes(self) -> float:
        return self._raw_bytes / (1024 ** 2)

    # 吉字节
    @property
    def gbytes(self) -> float:
        return self._raw_bytes / (1024 ** 3)

    # 千比特,1字节=8比特,网络带宽场景默认用十进制换算
    @property
    def kbits(self) -> float:
        return self._raw_bytes * 8 / 1000

    # 兆比特
    @property
    def mbits(self) -> float:
        return self._raw_bytes * 8 / (1000 ** 2)

    # 吉比特
    @property
    def gbits(self) -> float:
        return self._raw_bytes * 8 / (1000 ** 3)

    # 兼容直接打印场景
    def __repr__(self):
        return f"{self._raw_bytes} bytes"

    # 兼容原有数值运算、比较逻辑
    def __int__(self):
        return int(self._raw_bytes)

    def __float__(self):
        return float(self._raw_bytes)

第二步:改造原有IOCounters类

所有返回字节计数的属性,直接将原始字节值包装为ByteValue实例返回即可,后续新增的计数器(recv、avg_sent、avg_recv、total类属性等)都按同样逻辑实现:

class IOCounters:
    def __init__(self):
        self._sent_bytes = 65535  # 示例用固定值
        self._recv_bytes = 131072
        self._avg_sent = 1024
        # 其余计数器按相同逻辑初始化即可

    @property
    def sent(self):
        return ByteValue(self._sent_bytes)

    @property
    def recv(self):
        return ByteValue(self._recv_bytes)

    @property
    def avg_sent(self):
        return ByteValue(self._avg_sent)

    # avg_recv、total_sent、total_recv等属性按上述相同模式实现即可

调用效果

直接按照预期方式调用即可,所有属性自动支持全部单位转换:

counter = IOCounters()
print(counter.sent.mbits)   # 输出: 0.52428
print(counter.sent.bytes)   # 输出: 65535
print(counter.sent.gbytes)  # 输出: 6.103515625e-05
print(counter.recv.kbytes)  # 输出: 128.0
# 原有数值运算、比较逻辑完全兼容
print(counter.avg_sent > 1000) # 输出: True

方案优势

  • 无重复代码:单位转换逻辑仅需编写一次,所有计数器自动复用
  • 易扩展:后续需要新增单位(比如tbytes、tbits),仅需在ByteValue类中新增对应属性,所有计数器自动获得该单位转换能力,无需修改IOCounters类代码
  • 平滑兼容:通过魔法方法适配数值场景,原有直接读取计数器做计算、比较的逻辑不会报错

内容的提问来源于stack exchange,提问作者Orsiris de Jong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:42:18