【问题标题】:In python, how do I call the correct constructor from the method of a mixin class?在python中,如何从mixin类的方法中调用正确的构造函数?
【发布时间】:2016-03-10 23:45:12
【问题描述】:

假设我有两个容器类,它们的行为略有不同,但有很多常用方法。我使用 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 添加一个新方法,该方法创建并返回一个新容器对象——如果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。

【问题讨论】:

  • 对任何重要的事情都非常小心地使用 Mixins,它们很快就会失控。为什么要将构造功能放入 mixin 的实例级(例如,而不是仅在基类上调用 init 方法(或类级构造函数)?
  • 我想我不明白为什么你不能只使用子类的构造函数。?

标签: python python-2.7 oop inheritance multiple-inheritance


【解决方案1】:

你使用classmethod

class Mixin(object):
    @classmethod
    def alternate_constructor(cls, spam):
        return cls(spam)

请注意,您在此处使用的 mixins 似乎有点不对劲。通常,在使用继承(单个或多个)时,您需要调用基类上的方法。例如在你的情况下,Mixin 和它混合的各种类不能都调用它们的构造函数。实际上,例如,您甚至没有在 BaseClass 中为 SpamContainer 调用 __init__。这有点奇怪。如果您打算使用多重继承进行任何工作,我强烈建议您阅读Super Considered Super! 和配套文章Super considered harmful。这将帮助您了解多重继承的陷阱(以及如何避免它们)。

【讨论】:

  • 您忘记声明 cls 参数。
  • @jwodder -- 谢谢。我已经在继续“如果你要使用 Mixins,你应该小心”。
  • 谢谢,我已经编辑了我的问题,包括super() 对基类的调用。在排除你的答案之前,我会阅读一些关于@classmethod 和你的其他链接的内容。
猜你喜欢
  • 2011-01-26
  • 2016-05-27
  • 1970-01-01
  • 2013-08-27
  • 2016-02-05
  • 2021-10-17
  • 2015-10-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多