1

私は Python は初めてですが、趣味でプログラムを書いているので、OOP とコンピューター プログラミング全般についてある程度の知識があります。私は単純な動物シミュレーターに取り組み始めました。異教徒の動きかもしれませんが、動物のすべての「アクション関数」を辞書に保存して、各関数に文字列でアクセスできるようにしようとしています。たとえばdict['SLEEP']()、sleep 関数を呼び出します。

私が達成しようとしていることの例を見つけることができませんでした.率直に言って、私の問題を知的に説明する方法がわかりません. 以下の必要最小限のコードを参照してください。

class Animal:

    def __init__(self):
        self.health = 100
        self.actions = {}  # dictionary of functions
        self.initializeAnimal()

    def initializeAnimal(self):
        self.actions['SLEEP'] = self.initializeSleep()  # add sleep function 

    def initializeSleep(self):
        RESTORED_HEALTH = 20
        # other constants

        def sleep(self):
            self.health += RESTORED_HEALTH
            # utilize other constants

        return sleep

次に、動物ハンドラーは次の行に沿って何かを実行します。

for animal in animalList:
    animal.actions['SLEEP']()

もちろん、sleep 関数が呼び出されたときに動物の健康が 20 増加することを望みます。代わりに、何も起こりません。いくつかの調査と実験の後self、関数に渡されたものはsleep()明らかinitializeSleep()に動物クラスではなく参照されていることがわかりました。

この方法で関数を呼び出すときに、動物の健康状態をどのように変更するかについて、私はやや途方に暮れています。どうにかしてスーパークラスの呼び出しを利用する必要がありますか?

編集:構文を明確にする

4

2 に答える 2

1

self属性をsleep関数に入れる必要はありません。
次のことを行うことは完全に有効です。

class Animal:
    def __init__(self):
        self.health = 100
        self.actions = {}  # dictionary of functions
        self.initializeAnimal()

    def initializeAnimal(self):
        self.actions['SLEEP'] = self.initializeSleep()  # add sleep function 

    def initializeSleep(self):
        RESTORED_HEALTH += 20
        # other constants

        def sleep():
            self.health += RESTORED_HEALTH
            # utilize other constants
        return sleep

a = Animal()
print(a.health)
a.actions['SLEEP']()
print(a.health)

出力:

100
120

述べたように、+=inを忘れましたself.health = RESTORED_HEALTH
あなたも見逃しselfself.initializeSleep()

于 2013-06-07T03:39:36.153 に答える