Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 静态方法作为类方法的默认参数_Python_Static Methods_Argument Passing - Fatal编程技术网

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

Python 静态方法作为类方法的默认参数,python,static-methods,argument-passing,Python,Static Methods,Argument Passing,我的问题是关于另一个问题的两个答案: 我想知道这两个答案之间是否真的有区别,如果有,各自的优缺点是什么 问题:如何使用类方法作为同一类中方法的默认参数 回答1:使用函数而不是类方法 class X: def default_func(x): return True def test(self, func = default_func): return func(self) 回答2:使用类方法,但将其转换为函数 def unstaticmetho

我的问题是关于另一个问题的两个答案:

我想知道这两个答案之间是否真的有区别,如果有,各自的优缺点是什么

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

回答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\u func
的其他意图。如果希望在X实例之外调用
X.default_func
,则希望它是一个静态方法(答案2)

另一方面,如果您不希望在X的实例中调用default_func(当然也用作
test
的默认值),我会重新编写答案1,使其成为一个合适的方法(并使用
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:
下的整个块(包括
test(func)
的默认参数)之前,类X不会被创建(默认的_func不会成为X的方法)。

我会感到困惑。如果只在test()内调用default_func,但从类外调用test(),那么如何从类外调用相当于“X().test(func=second_func)”的函数,其中second_func是X的成员函数。Python 2没有“成员函数”的概念。类及其实例只有方法。如果“second\u func”是一个常规实例方法,则需要使用
im\u func
X().test(func=X.second\u func.im\u func)
获取底层函数。我不建议这样做。如果需要动态选择方法,最好将方法名传递给测试函数,然后在测试中执行类似于
getattr(self,func_name)(
)的操作,并让Python执行实例绑定。
class X:
    def default_func(self):
        return True

    def test(self, func = default_func):
        return func(self)
class X:
    def default_func(x):
        return True

    def test(self, func = default_func):
        return func(self)

    default_func = staticmethod(default_func)