我的问题是关于另一个问题的两个答案:Using class/static methods as default parameter values within methods of the same class。
我试图了解这两个答案之间是否真的有区别,如果是,那么每个答案的优缺点是什么。
问题:如何使用类方法作为同一类中方法的默认参数。
答案1:使用函数而不是类方法
class X:
def default_func(x):
return True
def test(self, func = default_func):
return func(self)
答案2:使用类方法,但将其转换为函数
def unstaticmethod(static):
return static.__get__(None, object)
class X:
@staticmethod
def default_func(x):
return True
def test(self, func = unstaticmethod(default_func)):
return func(self)
这最初是用Python 2编写的,但我的摘要(希望是)Python 3。
答案 0 :(得分:3)
答案实际上取决于你对X.default_func
的其他意图。如果您打算在X实例之外调用X.default_func
,那么您希望它是一个静态方法(答案2)。
# in other code...
some_object = "Bring out your dead"
X.default_func(some_object)
另一方面,如果你不希望调用default_func,除非在X的实例中(当然还用作test
的默认值),我会重新编写答案1是一个正确的方法(并使用self
)的惯例。
class X:
def default_func(self):
return True
def test(self, func = default_func):
return func(self)
作为旁注,我想指出你可以用不同的方式写出答案2,以避免出现不明原因的方法:
class X:
def default_func(x):
return True
def test(self, func = default_func):
return func(self)
default_func = staticmethod(default_func)
之所以有效,是因为在处理class X:
下面的整个块之前,没有创建类X(并且default_func不会成为X的方法)(包括{{1}的默认参数})。