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

如何解决类方法作为__init__默认参数时的NameError问题?

解决方法

方案一:用None作为默认参数,在构造函数内部赋值

把默认参数设为None,在__init__方法内部判断:如果没有传入自定义函数,就将类内的filename_parser方法赋值给file_rename_func。这种方式能避开默认参数的求值时机问题——__init__执行时,self已经创建完成,类的方法也已定义好,可以正常引用。

简化版代码

class MyClass:
    def __init__(self, filename, file_rename_func=None):
        self.filename = filename
        # 未传入自定义函数时,使用类内的filename_parser方法
        self.file_rename_func = file_rename_func or self.filename_parser

    def filename_parser(self, filename):
        return filename + '. Hi, StackOverflow!'

严谨版代码(避免空值干扰)

class MyClass:
    def __init__(self, filename, file_rename_func=None):
        self.filename = filename
        if file_rename_func is None:
            self.file_rename_func = self.filename_parser
        else:
            self.file_rename_func = file_rename_func

    def filename_parser(self, filename):
        return filename + '. Hi, StackOverflow!'

原写法报错原因

  • 第一种写法file_rename_func=filename_parser:函数默认参数在定义阶段就会被求值,此时MyClass还未完成定义,filename_parser这个名称还不存在,因此抛出NameError。
  • 第二种写法file_rename_func=self.filename_parser:self是__init__的参数,只有在函数调用阶段才会被传入,而默认参数的求值发生在定义阶段,此时self还未创建,自然找不到该名称。

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:06:27