1

以下の Python は何らかの理由で失敗します。

class NetVend:
    def blankCallback(data):
        pass

    def sendCommand(command, callback=NetVend.blankCallback):
        return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

    def sendSignedCommand(command, signature, callback):
        pass

次のエラーが表示されます。

Traceback (most recent call last):
  File "module.py", line 1, in <module>
    class NetVend:
  File "module.py", line 5, in NetVend
    def sendCommand(command, callback=NetVend.blankCallback):
NameError: name 'NetVend' is not defined
4

2 に答える 2

4

定義中のクラス名を参照することはできません。

クラス本体はローカル名前空間として実行されます。代わりに、関数と属性をローカル名として参照できます。

さらに、関数キーワード パラメータのデフォルト値は、メソッドが呼び出されたときではなく、定義時にバインドされます。None代わりに歩哨として使用してください。

それ以外の:

def sendCommand(command, callback=NetVend.blankCallback):
    return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

使用する:

def sendCommand(command, callback=None):
    if callback is None:
        callback = NetVend.blankCallback
    return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

このクラスを、本質的に関数である名前空間としてではなく、インスタンスのファクトリとして使用したいと考えたことでしょう。インスタンス (シングルトン) を 1 つだけ使用した場合でも、実際に最初にインスタンスを作成することには利点があります。

于 2013-09-04T12:29:58.647 に答える