传递self.var(实例属性)作为默认方法参数

时间:2016-06-30 07:19:40

标签: python class

在函数num1 = self.var1中分配fiz时,Python表示未解析的引用。那是为什么?

class Foo:

    def __init__(self):
        self.var1 = "xyz"

    def fiz(self, num1=self.var1):
        return

1 个答案:

答案 0 :(得分:2)

方法(和函数)默认参数值在定义方法时解析 。当这些值可变时,这会导致常见的Python问题:"Least Astonishment" and the Mutable Default Argument

在您的情况下,定义方法时没有self可用(如果范围中有这样的名称,因为您尚未实际定义类Foo,它不会是Foo实例!)您不能在定义中按名称引用;引用Foo也会导致NameErrorCan I use a class attribute as a default value for an instance method?

相反,常见的方法是使用None作为占位符,然后在方法体内分配默认值:

def fiz(self, num1=None):
    if num1 is None:
        num1 = self.val1
    ...