1. ホーム
  2. python

[解決済み] インスタンスメンバのデフォルト引数値をメソッドに渡すには?

2023-06-17 21:11:13

質問

インスタンスの属性の値を使って、インスタンスメソッドにデフォルトの引数を渡したいのですが、どうすればいいですか?

class C:
    def __init__(self, format):
        self.format = format

    def process(self, formatting=self.format):
        print(formatting)

それを試すと、次のようなエラーメッセージが表示されます。

NameError: name 'self' is not defined

このようなメソッドの動作をさせたい。

C("abc").process()       # prints "abc"
C("abc").process("xyz")  # prints "xyz"

何が問題なのでしょうか、なぜこれが動作しないのでしょうか。また、どうすればこれを動作させることができるでしょうか?

どのように解決するのですか?

デフォルト値はメソッドの定義時に評価されるため、インスタンスが存在する前であるため、これをデフォルト値として実際に定義することはできません。通常のパターンでは、代わりに次のようなことを行います。

class C:
    def __init__(self, format):
        self.format = format

    def process(self, formatting=None):
        if formatting is None:
            formatting = self.format
        print(formatting)

self.format が使用されるのは formattingNone .


デフォルト値がどのように機能するかのポイントを示すために、この例をご覧ください。

def mk_default():
    print("mk_default has been called!")

def myfun(foo=mk_default()):
    print("myfun has been called.")

print("about to test functions")
myfun("testing")
myfun("testing again")

そして、ここでの出力。

mk_default has been called!
about to test functions
myfun has been called.
myfun has been called.

注目すべきは mk_default が一度だけ呼び出され、それは関数が呼び出される前に起こったのです!