python实例变量作为可选参数

时间:2009-05-15 05:40:57

标签: python function class

在python中,有没有办法可以在类方法中使用实例变量作为可选参数?即:

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

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:14)

试试这个:

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

答案 1 :(得分: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中的两个下划线表示“强烈私密”,这意味着调用者知道他们不应该试图弄乱它(并且需要做一些工作才能这样做,明确地模仿编译器正在进行的名称修改)

您不能仅使用您发布的代码(btw)的原因是,def语句在评估时评估默认值,而不是稍后在调用时评估;并且在def评估的时候,还没有self从中获取实例变量。

答案 2 :(得分:2)

不,因为当类函数定义时间

时实例不存在

你必须重写如下

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

这与原始版本略有不同:如果你真的想要,你不能传递带有None值的arg3。

替代解决方案:

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

答案 3 :(得分:0)

def foo(self, blah=None):
    blah = blah if not blah is None else self.instance_var

这适用于python 2.5和转发,并处理blah为空字符串,列表等的情况。

答案 4 :(得分:-1)

另一种方法是:

def foo(self, blah=None):
    blah = blah or self.instance_var

这个较短的版本看起来更好,特别是当有多个可选参数时。

小心使用。请参阅以下评论......