【问题标题】:Passing self.var (instance attribute) as default method parameter [duplicate]将self.var(实例属性)作为默认方法参数传递[重复]
【发布时间】:2016-06-30 07:19:39
【问题描述】:

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

class Foo:

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

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

【问题讨论】:

  • 默认值不能引用其他参数,包括self,因为它们“不在同一范围内”。事实上,这些值是在方法运行之前解析的。这也是为什么def f(my_list = []) not 每次调用都会创建一个新列表的原因。解决此问题的一种方法是使用def fiz(self, num1 = None): if num1 is None: num1 = self.var1.. 如果“无”和“未指定”之间存在差异, kwargs 可以使用。
  • self 不在类定义范围内 - 在定义类之前你不能拥有实例!只需使用None 作为默认值,然后在方法中设置num1 = self.var1 if num1 is None else num1

标签: python class


【解决方案1】:

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

在您的情况下,定义方法时没有可用的self(如果在范围内有这样的名称,因为您实际上还没有完成定义类Foo,它不会是Foo 实例!)您也不能在定义中按名称引用 class;引用 Foo 也会导致 NameError: Can 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
    ...

【讨论】:

  • @BillalBEGUERADJ 因为我最初没有找到重复项,所以写了一个答案,然后想到了另一个我可以使用的搜索词并设法找到了一个。现在我不能删除这个答案,因为它已被接受。
  • 还不错,祝你有美好的一天+1
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2020-08-04
  • 2012-10-23
  • 2011-04-30
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多