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