もう一つ、没ったコードを挙げておきます。*1
class Base(object): class Inner1(object): pass class Inner2(object): foo = Base.Inner1() # ← これNG def do_nothing(self): foo = Base.Inner1() # ← こちらはOK print foo Base.Inner2().do_nothing()
Traceback (most recent call last): File "?.py", line ?, in <module> class Base(object): File "?.py", line ?, in Base class Inner2(object): File "?.py", line ?, in Inner2 foo = Base.Inner1() NameError: name 'Base' is not defined
以下、予想。
Inner2クラスブロックから見えるのは、ローカルスコープとグローバルスコープだけなので、Baseクラスブロックの名前(特に"Inner1")は見えません。そのため、Inner1を参照するにはグローバルスコープを経由してBase.Inner1とする必要があります。*2
ところが、グローバルスコープに"Base"が追加されるのはBaseクラスブロックを抜けた後なので、Inner2クラスブロックを実行しているときは参照できません。メソッドからは参照ができるのは、メソッドが実行されるのはBaseクラスブロックを抜けた後だからです。