>假设我有两个容器类,它们的行为略有不同,但有很多常用方法。 我使用 mixin 类将这些方法添加到两个容器中。
例如:
class SpamContainer(Mixin, BaseClass):
def __init__(self, spam):
super(SpamContainer, self).__init__(spam)
class DifferentSpamContainer(Mixin, DifferentBaseClass):
def __init__(self, spam):
super(DifferentSpamContainer, self).__init__(spam)
class Mixin(object):
# has no __init__()
def useful_method(self):
for s in self.spam:
# do something
现在我想向Mixin
添加一个创建新方法并返回一个新的容器对象 - 如果self
是一个SpamContainer
,我想创建一个,而如果它是一个DifferentSpamContainer
,我想创建一个。 如何从Mixin
方法中调用正确的构造函数?
我想也许我可以使用这样的东西:
class Mixin(object):
def method(self, spam):
return self.__init__(spam)
或
class Mixin(object):
def another_method(self, spam):
return self.__class__(spam)
但我无法让它工作。
我正在使用python 2.7。
您使用classmethod
:
class Mixin(object):
@classmethod
def alternate_constructor(cls, spam):
return cls(spam)
请注意,您在此处使用mixins似乎有点不对劲。 通常,在使用继承(单个或多个)时,需要调用基类上的方法。 例如,在您的情况下,Mixin
和它与之混合的各种类不能都调用它们的构造函数。 事实上,例如,您甚至不会在BaseClass
中拨打__init__
SpamContainer
。 这有点奇怪。 如果你打算做任何关于多重继承的工作,我强烈建议你阅读超级被认为是超级!和配套文章超级认为有害。 这将帮助您了解多重继承的陷阱(以及如何避免它们)。