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
相关产品推荐
相关产品推荐

