How to change the base class

I have a class that is derived from a base class and has many lines of code

eg.

class AutoComplete(TextCtrl):
    .....

What I want to do is change the base class so that it works like

class AutoComplete(PriceCtrl):
    .....

I have a use for both types of auto complexes and maybe I would like to add more base classes, so how can I do this dynamically?

Composition would be a solution, but I don't want to modify the code much.

any simple solutions?

+3
source share
3 answers

You may have a factory for your classes:

def completefactory(baseclass):
    class AutoComplete(baseclass):
        pass
    return AutoComplete

And then use:

TextAutoComplete = completefactory(TextCtrl)
PriceAutoComplete = completefactory(PriceCtrl)

, , , , AutoComplete mixin, TextAutoComplete :

class TextAutocomplete(TextCtrl, AutoComplete):
    pass
+7

:

class AutoCompleteBase(object):
    # code for your class
    # remember to call base implementation with super:
    #   super(AutoCompleteBase, self).some_method()

class TextAutoComplete(AutoCompleteBase, TextCtrl):
    pass

class PriceAutoComplete(AutoCompleteBase, PriceCtrl):
    pass

, :

class BasesToSeparateClassesMeta(type):
    """Metaclass to create a separate childclass for each base.
    NB: doesn't create a class but a list of classes."""
    def __new__(self, name, bases, dct):
        classes = []
        for base in bases:
            cls = type.__new__(self, name, (base,), dct)
            # Need to init explicitly because not returning a class
            type.__init__(cls, name, (base,), dct)
            classes.append(cls)
    return classes

class autocompletes(TextCtrl, PriceCtrl):
    __metaclass__ = BasesToSeparateClassesMeta
    # Rest of the code

TextAutoComplete, PriceAutoComplete = autocompletes

factory, , .

+2

You can change the tuple __bases__. For example, you can add another base class:

AutoComplete.__bases__ += (PriceCtrl,)

But in general, I will try to avoid such hacks, it quickly creates a terrible mess.

+1
source

Source: https://habr.com/ru/post/1716099/


All Articles