我想使用实例的属性值将默认参数传递给实例方法:
class C:
def __init__(self, format):
self.format = format
def process(self, formatting=self.format):
print(formatting)
尝试这样做时,出现以下错误消息:
NameError: name 'self' is not defined
我希望该方法的行为如下:
C("abc").process() # prints "abc"
C("abc").process("xyz") # prints "xyz"
这是什么问题,为什么这不起作用?我该如何做呢?
最佳答案
您不能真正将其定义为默认值,因为默认值是在定义方法(在任何实例存在之前)时评估的。通常的模式是改为执行以下操作:
class C:
def __init__(self, format):
self.format = format
def process(self, formatting=None):
if formatting is None:
formatting = self.format
print(formatting)
self.format
仅在formatting
为None
时使用。为了说明默认值的工作原理,请参见以下示例:
def mk_default():
print("mk_default has been called!")
def myfun(foo=mk_default()):
print("myfun has been called.")
print("about to test functions")
myfun("testing")
myfun("testing again")
和输出在这里:
mk_default has been called!
about to test functions
myfun has been called.
myfun has been called.
请注意,
mk_default
仅被调用一次,而这是在函数被调用之前发生的!