我想使用实例的属性值将默认参数传递给实例方法:

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仅在formattingNone时使用。

为了说明默认值的工作原理,请参见以下示例:
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仅被调用一次,而这是在函数被调用之前发生的!

10-04 22:43
查看更多