我有从基类派生的类,和具有的代码如何改变基类
例如许多许多线
class AutoComplete(TextCtrl):
.....
我想要做的是改变的基类,使得它像
class AutoComplete(PriceCtrl):
.....
我有两种类型的自动完成的使用,可能是想增加更多的基类,所以怎么能我动态地做到这一点?
组成将是一个解决方案,但我不想修改很多代码。
任何简单的解决方案?
我有从基类派生的类,和具有的代码如何改变基类
例如许多许多线
class AutoComplete(TextCtrl):
.....
我想要做的是改变的基类,使得它像
class AutoComplete(PriceCtrl):
.....
我有两种类型的自动完成的使用,可能是想增加更多的基类,所以怎么能我动态地做到这一点?
组成将是一个解决方案,但我不想修改很多代码。
任何简单的解决方案?
你可以有一个工厂为你的类:
def completefactory(baseclass):
class AutoComplete(baseclass):
pass
return AutoComplete
然后用:
TextAutoComplete = completefactory(TextCtrl)
PriceAutoComplete = completefactory(PriceCtrl)
在这取决于你想要达到的目标。另一方面,你的课怎么看,说不定自动完成是为了混合,所以你可以定义TextAutoComplete
:
class TextAutocomplete(TextCtrl, AutoComplete):
pass
您可以修改__bases__
元组。例如,你可以添加一个基类:
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
但是我还是建议类工厂的做法已经表明,一个水平的缩进真的不是什么大问题。
我在想类似的路线,但它需要我缩进整个代码,正如我所说的许多行,异议看起来微不足道,但我希望我不必缩进它 – 2009-08-26 12:28:18
不缩进:声明隐藏的类在_TextAutoComplete等模块的顶层,然后使用工厂。 – u0b34a0f6ae 2009-08-26 12:39:10
@Auurag,在块模式或sed中使用vim,它很容易重新使用(你应该学会如何做到这一点,在python编程时它非常有用) – tonfa 2009-08-26 12:54:54