Date: 2007-03-24
Tags: python

inspect.getmro

Pythonでクラスにクラス変数を定義する。そのクラスを継承してそこでクラス変数をoverrideする。

# a.py
class A(object):
    path = 'foo'

# b.py
class B(A)
    path = 'bar'

# c.py
class C(A)
    pass

a = A()
b = B()
c = C()

このとき、b.pathはもちろん'bar'になるがpathが宣言されているクラス名も欲しくて'B.bar'みたいに文字列を作りたい。

import inspect
def makepath(o):
    objs = inspect.getmro(b.__class__)
    for x in objs:
      if 'path' in x.__dict__:
          return '.'.join(x.__name__, x.path)

print makepath(a)
print makepath(b)
print makepath(c)

これで、 A.foo, B.bar, A.foo という文字列が取得できる。問題。c.path='moo'が設定された場合、 C.moo と出力するにはどうすればいいか。ヒント: c.__dict__

うーん、用途を書かないと意味不明だw