4

私の質問は、別の質問に対する2つの答えについてです。同じクラスのメソッド内のデフォルトのパラメーター値としてクラス/静的メソッドを使用する

私は、2つの答えが実際に違いがあるかどうか、もしそうなら、それぞれの長所と短所は何かを理解しようとしています。

質問:同じクラスのメソッドのデフォルトパラメータとしてクラスメソッドを使用する方法。

回答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)

これは元々Python2で書かれていましたが、私の要約は(うまくいけば)Python3です。

4

1 に答える 1

3

答えは本当にあなたが他にどんな意図を持っているかに依存しますX.default_funcX.default_funcXのインスタンスの外部で呼び出される場合は、静的メソッドにする必要があります(回答2)。

# in other code...
some_object = "Bring out your dead"
X.default_func(some_object)

一方、Xのインスタンス内を除いてdefault_funcが呼び出されることを期待しない場合(そしてもちろんのデフォルトとして使用されるtest)、Answer 1を適切なメソッドに書き直します(そしての規則self)。

class X:
    def default_func(self):
        return True

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

補足として、unstaticmethodを回避するために、回答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 に答える