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

In python, how do I call the correct constructor from the method of a mixin class?

假设我有两个容器 classes,它们的行为略有不同,但有很多通用方法。我使用 mixin class 将这些方法添加到两个容器中。

例如:

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 添加一个新方法来创建和 returns 一个新的容器对象 - 如果 selfSpamContainer,我想创建其中之一,而如果它是 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 似乎有点不对劲。通常,在使用继承(单个或多个)时,您会希望调用 base-class 上的方法。例如在您的情况下, Mixin 和它所混合的各种 class 不能同时调用它们的构造函数。事实上,例如,您甚至没有在 BaseClass 中为 SpamContainer 调用 __init__。这有点奇怪。如果您打算使用多重继承进行任何工作,我强烈建议您阅读 Super Considered Super! and companion article Super considered harmful。这将帮助您了解多重继承的陷阱(以及如何避免它们)。