问题
IS there any magic I can use in Python to to effectively use super constructor by just adding some extra arguments?
Ideally I'd like to use something like:
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)
And then be able to use the original constructor arguments mixed with some extra stuff from my class. Like so:
zip = ZipArchive('test.zip', 'w')
zip = ZipArchive('test.zip', 'w', verbose=False)
I'm using Python 2.6, but if the magic can only be achieved in higher version of Python then I'm interested too.
EDIT: I should probably mention that above doesn't work. The error is: TypeError: __init__() takes at most 2 arguments (3 given)
回答1:
You are almost there:
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)
Python 2 is a little persnickety and funny about mixing *args
, **kwargs
and additional named keyword arguments; your best bet is to not add additional explicit keyword arguments and just take them from kwargs
instead.
The dict.pop() method removes the key from the dictionary, if present, returning the associated value, or the default we specified if missing. This means that we do not pass verbose
on to the super class. Use kwargs.get('verbose', True)
if you just want to check if the paramater has been set without removing it.
来源:https://stackoverflow.com/questions/17106662/how-to-pass-all-arguments-from-init-to-super-class