4

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

我试图了解这两个答案的作用是否真的有区别,如果是,那么每个答案的优缺点是什么。

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

答案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。

4

1 回答 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 以避免使用非静态方法:

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 的方法test(func))。

于 2011-01-27T13:36:28.020 回答