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

CYA*_*EVI 7 python class

num1 = self.var1在 function 中赋值时fiz,Python 说未解析的引用。这是为什么?

class Foo:

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

    def fiz(self, num1=self.var1):
        return
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 7

方法(和函数)的默认参数值在定义方法时解析。当这些值是可变的时,这会导致一个常见的 Python 陷阱:“Least Astonishment”和可变默认参数

在您的情况下,定义方法时没有self可用的(如果范围内有这样的名称,因为您实际上还没有完成类的定义Foo,那么它就不是一个Foo实例!)您不能引用通过定义内的名称到类;引用Foo也会导致NameError我可以使用类属性作为实例方法的默认值吗?

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

def fiz(self, num1=None):
    if num1 is None:
        num1 = self.val1
    ...
Run Code Online (Sandbox Code Playgroud)