pythonで継承

サブクラスを作ったらこんなエラーが検出された。→ (解決)

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

使用コード:

スーパークラス(hoge.py)

このコードは問題なかった。

#!/usr/bin/python
# vim: fileencoding=utf-8

class hoge:
    def set_values(self, val):
        self.values = val
    def prt_values(self):
        print self.values

サブクラス(sub_hoge.py)

このコードに不備があった

#!/usr/bin/python
# vim: fileencoding=utf-8

import hoge

class sub_hoge(hoge):   ←ココが×
    def prt_values(self):
        print 'value.subclass => "%s"' % self.values

x = sub_hoge()
x.set_values('hogehoge')
x.prt_values()

■解決方法

結論としては、スーパクラスの呼び出し方が過っていたので正しく修正。

オンラインマニュアルに記載があった。

正しい例:

import モジュール名

class サブクラス名 (モジュール名.スーパークラス名):

使用例に当てはめると:

import hoge

class sub_hoge (hoge.hoge):   # モジュール名とクラス名が同じなので、ちょっと気持ち悪い

その他、解決法:

上記のように「モジュール名.クラス名」では無く、「クラス名」で直接使えるようになる。こっちの方がすっきり掛けるが複数のモジュールをロードする場合は、モジュール名を明示的に記述した方が見通しが良くなりそう。

from モジュール名 import スーパークラス名

class サブクラス名 (スーパークラス名):

蛇足

スーパクラスとサブクラスを1つのファイル内で定義した場合は、モジュールの名の記載が不要となる為、最初の失敗例の記述と同等になる。

hogeクラスのサブクラスとしてsub_hogeを定義:

#!/usr/bin/python
# vim: fileencoding=utf-8

class hoge:
    def set_values(self, val):
        self.values = val 
    def prt_values(self):
        print self.values

class sub_hoge(hoge):
    def prt_values(self):
        print 'value.subclass => "%s"' % self.values

x = sub_hoge()
x.set_values('hogehoge')
x.prt_values()

実行結果:

value.subclass => "hogehoge"

これは想定どおり

モジュールファイル化

各クラスごとモジュールファイルとして分割したらタイトルのエラーが発生

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)