もう一つ、没ったコードを挙げておきます。*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クラスブロックを抜けた後だからです。