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

如何正确重载带参数的__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:06:27