编程语言
首页 > 编程语言> > python – 静态方法作为类方法的默认参数

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

作者:互联网

我的问题是关于另一个问题的两个答案: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.

解决方法:

答案实际上取决于你对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的实例中(当然还用作测试的默认值),我会重写Answer 1作为一个合适的方法(和使用自我约定.

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)

之所以有效,是因为没有创建类X(并且default_func不会成为X的方法),直到处理了类X:下面的整个块之后(包括test(func)的默认参数).

标签:python,static-methods,argument-passing
来源: https://codeday.me/bug/20190630/1341357.html