如何更改基类

时间:2009-08-26 12:02:05

标签: python dynamic class

我有一个派生自基类的类,并且有许多行代码

e.g。

class AutoComplete(TextCtrl):
    .....

我想要做的是更改基类,使其像

一样工作
class AutoComplete(PriceCtrl):
    .....

我已经使用了两种类型的AutoCompletes,可能想添加更多的基类,那么我该如何动态地做呢?

组合本来就是一个解决方案,但我不想修改很多代码。

任何简单的解决方案?

3 个答案:

答案 0 :(得分:7)

你的班级可以有一个工厂:

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

然后使用:

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

另一方面,取决于您想要实现的目标以及您的类的外观,可能AutoComplete是一个mixin,因此您可以使用以下内容定义TextAutoComplete

class TextAutocomplete(TextCtrl, AutoComplete):
    pass

答案 1 :(得分:2)

您可以使用多重继承:

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

但是我仍然建议已经建议过班级工厂方法,一级压痕确实不是那么大的优惠。

答案 2 :(得分:1)

您可以修改__bases__元组。例如,您可以添加另一个基类:

AutoComplete.__bases__ += (PriceCtrl,)

但总的来说,我会尽量避免这种黑客行为,它会很快造成可怕的混乱。