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