不重写父类__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
相关产品推荐
相关产品推荐

