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

如何让父类返回参数数量不同的子类实例?

解决方法

问题根源在于:调用Number(0)时,父类__new__返回Zero实例后,Python会自动调用该实例的__init__方法,并将原调用的参数0传入,但Zero.__init__仅接受self,导致参数不匹配报错。以下是两种无需给Zero添加默认参数的解决思路:

方法一:让Zero.__init__接收任意参数并忽略

class Number:
    def __new__(cls, number):
        if cls is Number and number == 0:
            return Zero()
        return object.__new__(cls)

    def __init__(self, number):
        self.number = number

class Zero(Number):
    def __new__(cls):
        return super().__new__(cls, 0)

    def __init__(self, *args, **kwargs):
        # 忽略所有传入的额外参数,直接初始化
        self.number = 0

通过*args, **kwargs接收任意数量的位置参数和关键字参数,无论调用时传入什么参数都不会触发报错,同时直接完成Zero实例的初始化。

方法二:手动控制Zero实例的创建与初始化流程

class Number:
    def __new__(cls, number):
        if cls is Number and number == 0:
            # 直接创建Zero实例,不触发自动__init__
            zero_instance = object.__new__(Zero)
            # 手动调用Zero的__init__,仅传递self(隐式)
            zero_instance.__init__()
            return zero_instance
        return object.__new__(cls)

    def __init__(self, number):
        self.number = number

class Zero(Number):
    def __init__(self):
        self.number = 0

跳过Python自动调用__init__的逻辑,通过object.__new__(Zero)创建实例后,手动调用Zero.__init__(),确保只传递self参数,避免多余参数导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:52:38