Python子类继承父类时__init__方法传参报错:TypeError: 收到意外关键字参数'max_size'
解决Python子类继承时的参数传递错误及优化建议
首先咱们直击问题核心:你遇到的TypeError: FileValidatorPlus.__init__() got an unexpected keyword argument 'max_size',本质是你在实例化子类时传入了max_size参数,但子类的__init__方法根本没定义这个参数,Python不知道该把这个参数放哪,所以直接报错了。
除此之外,你的代码还有两个容易忽略的小问题:
- 调用父类构造器
super().__init__()时没有传递max_size,导致父类的self.max_size永远是默认的None,完全没用到你传入的参数 error_messages的合并方式可以更优雅,避免在实例化时重复处理
修正后的完整代码
class File: def __init__(self, file_size=100): self.file_size = file_size class FileValidator(object): error_messages = {'max_size': 'some error msg'} def __init__(self, max_size=None): self.max_size = max_size def __call__(self, file): print(self.max_size > file.file_size) class FileValidatorPlus(FileValidator): # 直接合并父类与子类的错误消息字典,一步到位 error_messages = {**FileValidator.error_messages, 'min_size': 'some other error msg'} # 显式接收父类需要的max_size参数,加上子类独有的min_size def __init__(self, max_size=None, min_size=None): # 把max_size传给父类构造器,确保父类属性正确初始化 super(FileValidatorPlus, self).__init__(max_size=max_size) self.min_size = min_size # 现在实例化不会再报错 validator = FileValidatorPlus(max_size=10, min_size=20) print(validator.error_messages) print(validator.max_size) print(validator.min_size)
关键修改点说明
让子类接收父类参数:
我们在FileValidatorPlus的__init__里显式定义了max_size参数,这样实例化时传入的max_size能被正确接收,再通过super()传给父类构造器,保证父类的属性能正常初始化。如果想让子类更灵活(比如父类以后新增参数不用改子类),也可以用
**kwargs兼容所有父类参数:def __init__(self, min_size=None, **kwargs): super().__init__(**kwargs) self.min_size = min_size优雅合并错误消息:
原来在__init__里用update合并字典的方式,改成了在类定义时直接用字典解包{**父类字典, **子类新内容},这样类属性一开始就是合并后的结果,不用在每次实例化时重复处理,更高效。正确传递参数给父类:
之前的super()调用没有传max_size,导致父类的self.max_size一直是None,现在把接收的max_size传进去,父类就能正确初始化这个属性了。
运行修正后的代码,会得到预期输出:
{'max_size': 'some error msg', 'min_size': 'some other error msg'} 10 20
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

