将静态方法作为类方法的默认参数
我想问的是关于另一个问题的两个回答:在同一个类的方法中使用类/静态方法作为默认参数值。
我在试图理解这两个回答之间是否真的有区别,如果有的话,各自的优缺点是什么。
问题是:如何在同一个类的方法中使用类方法作为默认参数。
回答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的。
1 个回答
3
这个答案其实要看你对 X.default_func
的其他想法。如果你希望 X.default_func
可以在 X 的实例之外被调用,那你就应该把它设为静态方法(答案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,以避免使用 unstaticmethod:
class X:
def default_func(x):
return True
def test(self, func = default_func):
return func(self)
default_func = staticmethod(default_func)
之所以这样有效,是因为类 X 还没有被创建(而 default_func
也不会成为 X 的方法),直到 class X:
下面的整个代码块处理完毕(包括 test(func)
的默认参数)。