无法在int子类中重写int值?Python自定义EnhancedInt类遇阻
嘿,我来帮你修复这个EnhancedInt类的问题!继承Python的int类型确实有点 tricky,因为它是不可变内置类型,咱们一步步来解决:
问题分析与修复方案
你的代码核心问题集中在不可变类型的初始化逻辑和位操作的细节完善上,以下是具体的修复思路和完整代码:
1. 不可变类型的初始化:用__new__而非__init__
Python的int是不可变类型,实例的创建由__new__方法负责,__init__是在实例已经生成后才会被调用的,所以重写__init__根本达不到你想要的初始化效果。我们需要替换成重写__new__来处理不同类型的输入。
2. __getitem__的逻辑补全
你想要实现小端序的位获取,还需要补充异常处理的细节,同时考虑边界情况(比如负数索引、超过有效位的场景)。
完整修复后的代码
from typing import Union, SupportsInt class EnhancedInt(int): def __new__(cls, x: Union[str, bytes, SupportsInt] = 0) -> 'EnhancedInt': # 处理不同类型的输入,转换为int后创建EnhancedInt实例 if isinstance(x, str): # 自动识别字符串的进制前缀(比如0b开头的二进制) x = int(x, base=0) elif isinstance(x, bytes): # 字节转整数,默认用小端序,可根据需求调整byteorder参数 x = int.from_bytes(x, byteorder='little') # 调用父类的__new__方法创建实例 return super().__new__(cls, x) def __getitem__(self, key: int) -> int: """返回自身二进制表示(小端序)中第key位的数值 Args: key (int): 位索引,从0开始(对应最低位,2^0) Returns: int: 0或1 """ if not isinstance(key, int): raise TypeError("位索引必须是整数类型") if key < 0: raise IndexError("位索引不能为负数") # 小端序下,第key位就是右移key位后与1按位与的结果 # 如果key超过当前整数的二进制位数,返回0(整数高位默认补0) return (self >> key) & 1
关键细节说明
__new__方法:负责处理字符串、字节、可转为int的对象等多种输入,将其统一转换为整数后生成EnhancedInt实例。其中字符串支持自动识别进制(比如"0b101"会被解析为5),字节默认按小端序转整数,你可以根据需求修改byteorder参数。__getitem__方法:- 增加了类型检查,确保索引是整数类型
- 禁止负数索引,符合常规的位索引使用习惯
- 小端序位获取逻辑:右移key位后与1按位与,就能精准拿到对应位的0或1;如果索引超过当前数的二进制位数,返回0(因为整数的高位默认补0)
- 如果你需要限制索引在32位范围内,可以把判断改成
if key > 31(0到31对应32位),然后抛出IndexError("位索引不能超过31(32位整数范围)")
测试示例
# 测试不同输入场景 e1 = EnhancedInt(5) # 二进制101,小端序位0是1,位1是0,位2是1 print(e1[0]) # 输出1 print(e1[1]) # 输出0 print(e1[2]) # 输出1 print(e1[3]) # 输出0(高位补0) e2 = EnhancedInt("0b110") # 二进制110,对应整数6 print(e2[0]) # 输出0 print(e2[1]) # 输出1 print(e2[2]) # 输出1 e3 = EnhancedInt(b'\x05') # 字节转整数,小端序下对应5 print(e3[0]) # 输出1
这样你的类就能正常处理整数的二进制位操作啦!
内容的提问来源于stack exchange,提问作者Assombrance Andreson
相关产品推荐
相关产品推荐

