在Python 3中,如何防止直接创建mixin类?

时间:2015-10-25 22:16:53

标签: python python-3.x

在Python 3中,我想编写一个只能用作mixin的类。有没有办法阻止直接创建它?

这是一个简单的具体例子:

class EqMixin:
    def __eq__(self, other):
        return type(self) == type(other) and self.__dict__ == other.__dict__
    def __hash__(self):
        return hash(tuple(sorted(self.__dict__.items())))

但是,我想允许

class Bar(EqMixin):
    ...

不允许

foo = EqMixin()

怎么做?

注意:我不能在EqMixin的__init__中引发异常,因为__init__可能会调用__init__

注意:我不想要一个抽象的基类(或者至少,我不想将任何抽象方法放入我的mixin中)。

2 个答案:

答案 0 :(得分:0)

听起来你想要创建一个abstract base class。也许使用abc模块?只要该类上至少有一个抽象方法未被覆盖,该类就无法实例化。

答案 1 :(得分:0)

也许会这样:

>>> class MustBeMixed(object):
...     def __init__(self):
...         if self.__class__ == MustBeMixed:
...             raise TypeError

>>> MustBeMixed()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
TypeError

用法:

>>> class Defuse(MustBeMixed):
...     def __init__(self):
...         super().__init__()
<__main__.Defuse object at 0x1099f8990>