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

是否存在标准类可通过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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:45