将静态方法作为类方法的默认参数

4 投票
1 回答
3671 浏览
提问于 2025-04-16 05:45

我想问的是关于另一个问题的两个回答:在同一个类的方法中使用类/静态方法作为默认参数值

我在试图理解这两个回答之间是否真的有区别,如果有的话,各自的优缺点是什么。

问题是:如何在同一个类的方法中使用类方法作为默认参数。

回答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) 的默认参数)。

撰写回答