在 python 中,如何从 mixin 类的方法调用正确的构造函数



>假设我有两个容器类,它们的行为略有不同,但有很多常用方法。 我使用 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。 这有点奇怪。 如果你打算做任何关于多重继承的工作,我强烈建议你阅读超级被认为是超级!和配套文章超级认为有害。 这将帮助您了解多重继承的陷阱(以及如何避免它们)。