Python 实例变量作为可选参数

8 投票
5 回答
4343 浏览
提问于 2025-04-15 11:36

在Python中,有没有办法在类的方法里把实例变量当作可选参数使用?比如:

def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
    # do stuff....

任何帮助都非常感谢。

5 个回答

2

不可以,因为在定义类的函数时,实例还不存在。

你需要按照下面的方式重写:

def function(self, arg1=val1, arg2=val2, arg3=None):
    if arg3 is None:
        arg3 = self.instance_var

这个和原来的稍微有点不同:如果你真的想的话,不能把arg3的值设为None。

另一种解决方案:

def function(self, arg1=val1, arg2=val2, **argd):
    arg3 = argd.get('arg3', self.instance_var)
5

所有建议使用 None 的回答都是对的;如果你想确保调用者可以把 None 当作普通参数传入,可以使用一个特别的 sentinel,然后用 is 来测试:

class Foo(object):
  __default = object()
  def foo(self, blah=Foo.__default):
    if blah is Foo.__default: blah = self.instavar

每次调用 object() 都会创建一个独特的对象,这样用 is 比较时,它和其他任何值都不会相等。这里的两个下划线 __default 表示“强私有”,意思是调用者知道不应该去碰它(而且如果想要碰,得费很大劲,得模仿编译器做的名字处理)。

顺便说一下,你不能直接使用你发的代码,原因是默认值是在 def 语句执行时就被计算出来了,而不是在调用时;而在 def 执行时,还没有 self 这个实例变量可以用。

16

试试这个:

def foo(self, blah=None):
    if blah is None: # faster than blah == None - thanks to kcwu
        blah = self.instance_var

撰写回答