我是否可以在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)
答案 0 :(得分:25)
你快到了:
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)
对于混合*args
,**kwargs
和其他命名关键字参数,Python 2有点不耐烦和有趣;您最好的选择是不添加其他显式关键字参数,而只需从kwargs
获取它们。
dict.pop()
method从字典中删除密钥(如果存在),返回关联值,或者我们指定的默认值(如果缺少)。这意味着我们不将verbose
传递给超类。如果您只想检查参数是否已设置而未将其删除,请使用kwargs.get('verbose', True)
。