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

如何在__init__函数中修改BlockCipher继承的SBox、PBox等父类初始属性

问题解答

完全可以在BlockCipher子类的__init__函数中修改继承自父类的属性,这是更推荐的实现方式。

  • 从封装逻辑来说,把属性初始化、修改的逻辑都收拢到类的__init__方法内,比实例化后在外部修改self.S、self.S_I这类属性的可维护性更高。你要生成数千个测试实例的时候,只要给__init__传不同的参数就能批量生成,不用每次实例化后都写重复的修改代码。
  • 实现时需要注意,修改父类属性前要先调用父类的初始化方法,避免父类属性还没定义就报错。多继承场景下可以用super()按方法解析顺序调用父类__init__,也可以显式调用每个父类的初始化方法,示例代码如下:
class BlockCipher(SBox, PBox, Key):
    def __init__(self, custom_S=None, custom_S_I=None, custom_P=None, custom_key=None):
        # 先调用父类初始化完成基础属性的定义
        super().__init__()
        # 再根据传入的自定义参数修改继承的属性,没有传参就用父类默认值
        if custom_S is not None:
            self.S = custom_S
        if custom_S_I is not None:
            self.S_I = custom_S_I
        # 同理修改PBox、Key的继承属性
        if custom_P is not None:
            self.P = custom_P
        if custom_key is not None:
            self.master_key = custom_key
  • 如果你需要修改的是父类的类属性(不是实例属性),不要通过self.xxx修改,这种操作只会生成子类的实例属性覆盖父类值,不会影响其他实例;要修改父类类属性的话直接通过父类名.属性名修改即可。你的测试场景是每个实例需要不同参数,用实例属性修改的方式就足够了。
  • 两种修改方式的适用场景:
    • 如果你只是临时修改一两个实例的属性,实例化后直接修改也没问题
    • 如果你要批量生成数千个不同参数的实例,把逻辑放在__init__里,配合列表推导或者循环传参就能快速生成,代码更简洁,出错概率更低

内容的提问来源于stack exchange,提问作者page290

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:04