是否存在标准类可通过int(self)自动实现所有类int魔法方法?
解决方案:用类装饰器自动生成int代理方法
你不需要手动写40个魔法方法,用类装饰器可以一次性给你的类添加所有需要的int相关魔法方法,代理到int(self)的对应调用上,完全符合你的需求。
步骤1:实现类装饰器
这个装饰器会遍历int的核心魔法方法,给你的类动态添加对应的代理方法,所有方法都会先获取当前的int(self)值,再调用int的原生方法,返回普通int(或对应类型,比如字符串):
def mimic_int_behavior(cls): # 列出需要代理的int魔法方法,涵盖算术、位运算、转换等场景 proxy_methods = [ '__add__', '__sub__', '__mul__', '__truediv__', '__floordiv__', '__mod__', '__pow__', '__lshift__', '__rshift__', '__and__', '__xor__', '__or__', '__radd__', '__rsub__', '__rmul__', '__rtruediv__', '__rfloordiv__', '__rmod__', '__rpow__', '__rlshift__', '__rrshift__', '__rand__', '__rxor__', '__ror__', '__neg__', '__pos__', '__abs__', '__invert__', '__bool__', '__str__', '__repr__' ] def create_proxy_method(method_name): def proxy(self, *args, **kwargs): current_int = int(self) return getattr(current_int, method_name)(*args, **kwargs) return proxy # 只添加类中未自定义的方法,保留自定义逻辑的优先级 for method in proxy_methods: if not hasattr(cls, method): setattr(cls, method, create_proxy_method(method)) return cls
步骤2:装饰你的类
把装饰器加到你的FPGA连线/寄存器类上,只需要实现__int__方法来动态返回当前值即可:
@mimic_int_behavior class FPGASignal: def __init__(self, value_provider): # value_provider是一个可调用对象,返回当前的动态值 self.value_provider = value_provider def __int__(self): # 每次调用int(self)都会获取最新值 return self.value_provider()
用法示例
完全符合你需要的动态更新逻辑,而且运算结果都是普通int:
# 模拟FPGA实例 class FPGAInstance: def __init__(self): # wire1初始值为10 self.wire1 = FPGASignal(lambda: 10) # wire2的值永远是wire1 +10 self.wire2 = FPGASignal(lambda: int(self.wire1) + 10) inst = FPGAInstance() print(int(inst.wire2)) # 输出20 print(inst.wire2 + 5) # 输出25(普通int) print(inst.wire1 << 2) # 输出40(普通int) # 修改wire1的动态值 inst.wire1.value_provider = lambda: 20 print(int(inst.wire2)) # 输出30
为什么不继承int?
int是Python的不可变内置类型,继承后实例的数值在初始化时就固定了,无法实现你需要的动态更新逻辑。而且Python对int类型的__int__方法有内置处理,重写后不会生效——调用int(your_instance)时会直接返回继承的int值,而不是你重写的逻辑。
自定义扩展
如果某个魔法方法需要特殊处理(比如自定义字符串表现),直接在类里手动定义即可,装饰器会跳过已存在的方法,保留你的自定义逻辑。
内容的提问来源于stack exchange,提问作者AMADANON Inc.
相关产品推荐
相关产品推荐

