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

不重写父类__init__(),如何在子类实例化时添加新实例变量?

可行,这有几种不用重写父类__init__的实现方式:

方法1:用__new__方法初始化

__new__是Python中创建实例的底层方法,会在__init__执行前调用。我们可以在子类的__new__里创建实例后直接给e赋值:

class Parent:
    def __init__(self, a: int, b: int, c: int, d: int):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

class Child(Parent):
    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls, *args, **kwargs)
        instance.e = 5
        return instance

测试效果:

child = Child(1,2,3,4)
print(child.e)  # 输出5
child.e = 10    # 可以正常修改
print(child.e)  # 输出10

方法2:用property(只读默认值场景)

如果e不需要被修改,只是提供一个固定的默认值,可以用属性实现,不用额外初始化逻辑:

class Child(Parent):
    @property
    def e(self):
        return 5

这种方式下child.e永远返回5,尝试赋值会抛出AttributeError,适合不需要变更默认值的场景。

方法3:元类批量处理(进阶)

如果有多个子类需要添加类似的默认实例变量,可以用元类统一处理,避免重复代码:

class DefaultEMeta(type):
    def __call__(cls, *args, **kwargs):
        instance = super().__call__(*args, **kwargs)
        instance.e = 5
        return instance

class Child(Parent, metaclass=DefaultEMeta):
    pass

这样所有使用DefaultEMeta元类的子类,实例化时都会自动带上e=5的实例变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:42:38