Python 如何更改基类

Python 如何更改基类,python,dynamic,class,Python,Dynamic,Class,我有一个从基类派生的类,并且有很多行代码 e、 g 我想做的是更改基类,使其像 class AutoComplete(PriceCtrl): ..... 我对这两种类型的自动完成都有使用,并且可能希望添加更多的基类,那么我如何动态地进行呢 组合本来是一个解决方案,但我不想对代码进行太多修改 任何简单的解决方案?您可以为您的类创建一个工厂: def completefactory(baseclass): class AutoComplete(baseclass):

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

e、 g

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

class AutoComplete(PriceCtrl):
    .....
我对这两种类型的自动完成都有使用,并且可能希望添加更多的基类,那么我如何动态地进行呢

组合本来是一个解决方案,但我不想对代码进行太多修改


任何简单的解决方案?

您可以为您的类创建一个工厂:

def completefactory(baseclass):
    class AutoComplete(baseclass):
        pass
    return AutoComplete
然后使用:

TextAutoComplete = completefactory(TextCtrl)
PriceAutoComplete = completefactory(PriceCtrl)
另一方面,根据您想要实现的目标和类的外观,AutoComplete可能是一个混入,因此您可以使用以下内容定义
TextAutoComplete

class TextAutocomplete(TextCtrl, AutoComplete):
    pass

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

AutoComplete.__bases__ += (PriceCtrl,)

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

您可以使用多重继承来实现这一点:

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

但是我仍然建议使用已经建议过的类工厂方法,一个缩进级别其实没什么大不了的。

我也在考虑类似的行,但它要求我缩进整个代码,正如我所说的很多行,反对看起来微不足道,但我真的希望我不必缩进:将隐藏在模块顶层的类声明为_TextAutoComplete等,然后使用工厂。@Anurag,在块模式下使用vim,或sed,这非常容易重新缩进(您应该学习如何做,在python编程时非常有用)@tonfa谢谢,我知道如何缩进代码,但我只是不想嵌套1000行的整个类代码“扁平比嵌套好”
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