Pythonで多重継承を禁止する

継承の仕方に制限をつけたいときもあるかと思います。そんなときはtypeを継承して自分の好きなタイプを作って、__metaclass__で指定してみましょう。多重継承の他にも、メソッドに制限をつけることもできるでしょう。(以下の例では、継承数を1にしているので、多重継承禁止とは少し違います)

#!/usr/bin/env python2.6
import unittest
import sys
class BasicTests(unittest.TestCase):
  def test_multiple_inheritance_not_allowed(self):
    class OneParentType(type):
      def __new__(cls, name, bases, d):
        assert 1 == len(bases), "multiple inheritance not allowed."
        return type.__new__(cls, name, bases, d)
    class A(object):
      __metaclass__ = OneParentType
    class B(A):
      pass
    b = B()
    try:
      class C(A, B):
        pass
    except AssertionError:
      self.assertEqual('multiple inheritance not allowed.', str(sys.exc_info()[1]))
      return
    self.fail()
if __name__ == '__main__':
  unittest.main()