__init__与classmethod参数数量需一致吗?Film类实例化报错求助
问题解答
1. __init__方法和classmethod是否必须拥有相同数量的参数?
不需要。两者的参数设计完全独立:
__init__的第一个参数是实例对象(通常用self),其余参数由类的实例化需求决定;classmethod的第一个参数是类本身(通常用cls),其余参数由该类方法的功能需求决定。
只要在调用时满足各自的参数要求即可,没有参数数量必须一致的强制规定。
2. 代码错误分析与修复
你遇到的TypeError是因为类方法addFilm调用cls()创建实例时,传入的参数数量不匹配__init__的要求:
__init__需要4个必填位置参数:title、genre、year、rating;- 但
addFilm里的return cls(title, year, rating)只传了3个参数,缺少了genre参数,因此触发报错。
修复方案(二选一即可)
方案1:给addFilm补充genre参数,匹配__init__的要求
修改后的代码:
class Film: def __init__(self, title, genre, year, rating): self.title = title self.genre = genre self.year = year self.rate = rating @classmethod def addFilm(cls, title, genre, year, rating): return cls(title, genre, year, rating) film1 = Film("The GodFather", "Drama", 1972, 95) film2 = Film("Rafathar", "Comedy", 2019, 40) film3 = Film.addFilm("The Dark Knight", "Action", 1999, 86) # 补充genre参数
方案2:给__init__的genre设置默认值,允许缺省传入
修改后的代码:
class Film: def __init__(self, title, year, rating, genre="Unknown"): # 给genre设置默认值 self.title = title self.genre = genre self.year = year self.rate = rating @classmethod def addFilm(cls, title, year, rating): return cls(title, year, rating) # 此时会自动使用genre的默认值 film1 = Film("The GodFather", "Drama", 1972, 95) film2 = Film("Rafathar", "Comedy", 2019, 40) film3 = Film.addFilm("The Dark Knight", 1999, 86)
内容的提问来源于stack exchange,提问作者Endricho Folabessy
相关产品推荐
相关产品推荐

