15

追加の引数を追加するだけでスーパーコンストラクターを効果的に使用するためにPythonで使用できる魔法はありますか?

理想的には、次のようなものを使用したいと思います:

class ZipArchive(zipfile.ZipFile):
    def __init__(self, verbose=True, **kwargs):
        """
        Constructor with some extra params.

        For other params see: zipfile.ZipFile
        """
        self.verbose = verbose
        super(ZipArchive, self).__init__(**kwargs)

そして、元のコンストラクター引数を、クラスの追加のものと混ぜて使用できるようにします。そのようです:

zip = ZipArchive('test.zip', 'w')
zip = ZipArchive('test.zip', 'w', verbose=False)

私は Python 2.6 を使用していますが、魔法がより高いバージョンの Python でのみ達成できる場合は、私も興味があります。

編集:おそらく、上記は機能しないことに言及する必要があります。エラーは次のとおりです。TypeError: __init__() takes at most 2 arguments (3 given)

4

1 に答える 1

27

あなたはもうすぐそこにいます:

class ZipArchive(zipfile.ZipFile):
    def __init__(self, *args, **kwargs):
        """
        Constructor with some extra params:

        * verbose: be verbose about what we do. Defaults to True.

        For other params see: zipfile.ZipFile
        """
        self.verbose = kwargs.pop('verbose', True)

        # zipfile.ZipFile is an old-style class, cannot use super() here:
        zipfile.ZipFile.__init__(self, *args, **kwargs)

*argsPython 2 は、**kwargsと追加の名前付きキーワード引数を混在させることに少し執拗で面白いです。あなたの最善の策は、追加の明示的なキーワード引数を追加せkwargs、代わりにそれらを取得することです。

このdict.pop()メソッドは、存在する場合はキーをディクショナリから削除し、関連する値を返すか、欠落している場合は指定したデフォルトを返します。これは、スーパークラスに渡さないことを意味します。パラメーターを削除せずに、パラメーターが設定されているかどうかを確認したい場合にverbose使用します。kwargs.get('verbose', True)

于 2013-06-14T10:46:29.047 に答える