在python中,有没有办法可以在类方法中使用实例变量作为可选参数?即:
def function(self, arg1=val1, arg2=val2, arg3=self.instance_var):
# do stuff....
任何帮助都将不胜感激。
答案 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
这个较短的版本看起来更好,特别是当有多个可选参数时。
小心使用。请参阅以下评论......