使用self.*作为方法的默认值

52
def save_file(self, outputfilename = self.image_filename): 
    self.file.read(outputfilename)
    ....

第一行报错 NameError: name 'self' is not defined。看起来 Python 不接受这个。我该怎么改写代码以避免抛出异常?


函数定义发生在不同的作用域和不同的时间。 - Felix Kling
确实希望它能够正常工作。这会使代码更加简洁。我猜想这可能需要打开一些其他的潘多拉魔盒来实现? - JS.
4个回答

51

使用默认值 None 并进行检测。

def save_file(self, outputfilename=None): 
    if outputfilename is None:
        outputfilename = self.image_filename
    self.file.read(outputfilename)
    ....

9
这个模式存在问题,它容易造成误导。 - Nikolai

14

文档中说:

默认参数的值在函数定义时被计算。

这就解释了为什么无法引用实例。正如其他人所说,在函数执行时使用None作为默认值,并在实例可用时修复该值。


11
def save_file(self, outputfilename=None): 
    outputfilename = outputfilename or self.image_filename
    self.file.read(outputfilename)

甚至可以
def save_file(self, outputfilename=None):         
    self.file.read(outputfilename or self.image_filename)

对于一个变量来说,这可能并不算什么,但如果你有5个变量,这可以让代码更易读,我认为。


这应该是被接受的答案,因为它比当前的答案更简洁,并且完成了相同的事情。 - polortiz40

3
def save_file(self, outputfilename = None):
    if not outputfilename:
        outputfilename = self.image_filename 
    self.file.read(outputfilename)
    ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接