クラス変数初期化時に他のクラスメンバが見つからなくて死亡

にわかpython屋のわし、詰まる。

#python3

class A :

    def set(self, type, value) :
        A.FUNC_MAP[type](self, value)
    
    def _setSearch(self, s) :
        self.search = s
    
    def _setTitle(self, s) :
        self.title = s

    FUNC_MAP = {
        "search" : A._setSearch,    # NameError: name 'A' is not defined
        "title"  : A._setTitle,
    }

a = A()
a.set("title", "たいとる")
a.set("search", "検索語")

print(a.title)
print(a.search)

A::set() でメンバ変数をセット、セットする先の変数も関数の引数の文字列で dispatch する…って事をやりたくて、キーワードに対する関数マップを作りました。 が、A::_setSearch が見つから無ぇ! なんだとメガトロン!?

…と、一睡した結果こうなりました。

#python3

class A :

    def set(self, type, value) :
        A.FUNC_MAP[type](self, value)
    
    def _setSearch(self, s) :
        self.search = s
    
    def _setTitle(self, s) :
        self.title = s

    FUNC_MAP = {
        "search" : _setSearch,  # クラス名修飾要らない
        "title"  : _setTitle,
    }

a = A()
a.set("title", "たいとる")
a.set("search", "検索語")

print(a.title)
print(a.search)

嘘だと言ってよバーニィ! クラス変数初期化時はクラス名が不要だったなんて……


class Kashira :

    clazz = 10
    
    def bar(self) :
        print(Kashira.tamagoyaki)

とか、メンバ関数内からであってもクラス変数参照する際はクラス名を修飾しないとアカンので、すっかり付ける事しか頭に無かったわ…

Nameエラーの内容が「"A" なんか知らねぇよ。糞して寝ろ。二度と来んな」って言ってるって事は、つまる所クラス変数初期化時にまだ class A が存在しないって事なんですね。 おそらく初期化中だから。 なるほど…



あ、この程度なら dict に lambda 直接突っ込めばいいじゃんというツッコミは無しでお願いします(ぉ