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
相关产品推荐
相关产品推荐

