TkとWmとMiscの関係

Tkinter のルート widget(?) である Tkinter.Tk は Wm と Misc, 2つのクラスを継承してる。
とっつきやすそうな Wm (Window Manager)に目をつけて闇雲にメソッドを呼んでみる。

>>> import Tkinter
>>> wm = Tkinter.Wm()
>>> wm.wm_aspect()
  File "", line 1, in
     wm.wm_aspect()  File "D:\Python25\lib\lib-tk\Tkinter.py", line 1419, in wm_aspect
    return self._getints(AttributeError: Wm instance has no attribute '_getints'

まぁ、そんなもんか。メソッドが足りない模様。
_getints ってどこで定義されるの?
検索で一周してファイルの上の方に戻ったら class Misc で定義されてた。
最初に書いたように、Misc は Tk のもう一つのスーパークラス

てことは、Wm は一緒に Misc が継承されることを前提としている?
オブジェクト指向的にそんなのありだっけ?

純化するとこういう構造。

>>> class SuperA:
        def methodA(self):
            return 'A'
>>> class SuperB:
        def methodB(self):
            return self.methodA() + 'B'
>>> class Hoge(SuperA, SuperB):
        pass
>>> h = Hoge()
>>> h.methodB()
'AB'

Misc._getintsって?

def _getints(self, string):
      if string:
          return tuple(map(getint, self.tk.splitlist(string)))

今度は self.tk なるインスタンス変数を参照している。
これがどこにあるかというと、サブクラスのTkの中。

class Tk(Wm, Misc):
    def __init__(self, ...):
        # (中略)
       self.tk = _tkinter.create(...)

どうもこの3つのクラスは依存関係がややこしそうだなぁ。

で、Misc._getints って?

まず、self.tk.splitlist の正体をさぐる。

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> tk.tk.splitlist('a b c')
('a', 'b', 'c')
>>> tk.tk.splitlist('abc')
('abc',)
>>> tk.tk.splitlist('a,b_c:d;e-f+g/h')
('a,b_c:d;e-f+g/h',)
>>> tk.tk.splitlist('a\tb\nc   d')
('a', 'b', 'c', 'd')
>>> tk.tk.splitlist([1,2,3]) # エラー 
>>> tk.tk.splitlist(1)  # エラー

文字列を空白文字で分割してるだけ。
残るは getint だけどこれはモジュール内でこうなってた。

getint = int

結局、Misc._getints ってのは、
文字列を空白で分割して int の tuple にして返す処理でした。