如何正确重载带参数的__new__方法?附报错代码求助
正确重载带参数__init__类的__new__方法
问题原因分析
你代码报错的核心是:类A未自定义__new__,默认继承object.__new__。当你将A.__new__设为None再恢复时,相当于把未绑定的object.__new__函数直接赋值给A.__new__。正常情况下Python会对继承自object的__new__做特殊处理——调用时自动忽略多余参数,仅传入类对象cls;但显式赋值后该逻辑失效,调用A(1)时会把cls和1都传给object.__new__,而它仅接受一个参数,因此触发TypeError。
正确实现方式
场景1:临时替换后恢复__new__
若只是临时替换类的__new__方法,之后恢复原状,需保留原方法的绑定逻辑,避免直接赋值未绑定函数:
class A: def __init__(self, x): self.x = x # 保存原__new__方法 original_new = A.__new__ # 自定义临时__new__实现 def temp_new(cls, *args, **kwargs): print("临时__new__执行") # 调用原__new__创建实例,需传入cls及所有参数 return original_new(cls, *args, **kwargs) # 替换__new__ A.__new__ = temp_new # 测试调用 a = A(1) print(a.x) # 输出 1 # 恢复原__new__ A.__new__ = original_new # 验证恢复效果 a2 = A(2) print(a2.x) # 输出 2
场景2:长期自定义__new__
若需长期重载__new__,需保证方法接受cls参数及后续传递给__init__的参数,并通过父类__new__创建实例:
class A: def __new__(cls, x, *args, **kwargs): # 在这里添加自定义逻辑,比如实例创建前的校验或预处理 print(f"__new__触发,传入x={x}") # 调用父类__new__创建实例,必须传入cls instance = super().__new__(cls) return instance def __init__(self, x): self.x = x # 测试调用 a = A(1) print(a.x) # 输出 1
关键注意事项
__new__是类方法,第一个参数必须为cls(当前类对象)- 自定义
__new__必须返回一个实例对象(通常通过super().__new__(cls)获取),否则__init__不会被执行 - 若
__new__返回其他类的实例,当前类的__init__不会触发
内容的提问来源于stack exchange,提问作者royk
相关产品推荐
相关产品推荐

