如何解决类方法作为__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
相关产品推荐
相关产品推荐

