Get classes from "self.MyClass" to improve subclassability

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Jun 12 08:23:54 EDT 2015


On Fri, 12 Jun 2015 04:12:52 -0700, Thomas Güttler wrote:

> Here is a snippet from the argparse module:
> 
> {{{
>     def parse_known_args(self, args=None, namespace=None):
>         ...
>         # default Namespace built from parser defaults if namespace is
>         None:
>             namespace = Namespace() # < ======= my issue
> }}}
> 
> I subclass from the class of the above snippet.
> 
> I would like to use a different Namespace class.
> 
> if the above could would use
> 
>     namespace = self.Namespace()
> 
> it would be very easy for me to inject a different Namespace class.

Yes it would.

And here is how you do it, even when the parent class doesn't:

    class MySubclass(ParentClass):
        Namespace = Namespace
        def parse_known_args(self, args=None, namespace=None):
            if namespace is None:
                namespace = self.Namespace()
            # any other method overriding needed
            return super().parse_known_args(args, namespace)

In Python 2, you cannot use super(), you have to explicitly provide the 
arguments:

            return super(MySubclass,self).parse_known_args(args,namespace)


-- 
Steve



More information about the Python-list mailing list