Python 实例变量作为可选参数
在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