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

Python多构造器疑问:为何始终调用双参数__init__方法?

Python中__init__无法实现多构造器的原因及解决办法

问题原因

Python不支持方法重载,在同一个类里定义多个同名方法时,后定义的方法会直接覆盖前面的。你写的第二个__init__方法完全替换了第一个,所以不管你传1个还是2个参数,程序只会调用最后那个需要两个参数的__init__,创建p1时只传一个自然会报错。

解决办法

方法1:给参数设置默认值

通过给可选参数设默认值,在__init__内部根据参数是否存在分支处理:

class Person:
    def __init__(self, name, age=None):
        if age is None:
            print("Constructor with only name")
            self.name = name
        else:
            print("Constructor with name and age")
            self.name = name
            self.age = age
            self.gender = "female"

p1 = Person("John")
p2 = Person("John", 2)

方法2:使用类方法作为替代构造器

用@classmethod定义不同的构造入口,每个方法对应一种初始化逻辑:

class Person:
    def __init__(self, name, age=None, gender=None):
        self.name = name
        self.age = age
        self.gender = gender

    @classmethod
    def from_name(cls, name):
        print("Constructor with only name")
        return cls(name)

    @classmethod
    def from_name_age(cls, name, age):
        print("Constructor with name and age")
        return cls(name, age, "female")

p1 = Person.from_name("John")
p2 = Person.from_name_age("John", 2)

补充说明

你可能混淆了Python和其他支持方法重载的语言(比如Java、C++),Python里同名方法永远只会保留最后定义的那个,没法通过参数数量/类型区分调用哪一个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:52:02