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