0

質問のヘッダーが奇妙に聞こえるのは承知していますが、英語は私の母国語ではないので、形式化するのは非常に難しいと思います. ただし、もう少しテキストで説明できるかもしれません。

問題は、たとえば「Foo」というクラスを作成しようとしているということです。

# ../myProject/Foo.py

class Foo:
    '''Represents an example class for stackoverflow'''

現在、すべての Foo クラスのインスタンスにはfunction属性があり、インスタンスを介して実行できる関数を保持するだけです。また、が呼び出さparametersれたときに使用する必要があるパラメーターを保持する属性、タプルまたはリストがあります。function

    def __init__(self, function, parameters):
        self.function = function
        self.parameters = parameters

    def callFunction(self):
        if self.function:
            self.function(*self.parameters)

これはうまく機能しているようですが、問題は、インスタンスの属性を変更するために、デフォルト値を指定したいということです。私は基本的に次のことをしたい:

def __init__(self, function=setattr, \
        parameters=(self, "togglableAttribute", not self.togglableAttribute)):

そして、これを行うと、 が発生しNameError: name 'self' is not definedます。これを機能させるには、これをどのように実装する必要がありますか、または回避策を考え出す必要がありますか?

4

1 に答える 1

1

selfインスタンスを記述するために使用される一般的な変数名です。ただし、デフォルトの引数は、関数の作成時 (クラスの作成時) に評価されます。クラスがまだ存在しないため、もちろんselfまだ存在しません。クラスはまだ構築中です。

これを行う典型的な方法は、センチネルをチェックすることです。

def __init__(self, function=setattr, parameters=None):
    if parameters is None:
       parameters = (self, "togglableAttribute", not self.togglableAttribute)

センチネルとして使用できるさまざまなオブジェクトの説明と、それぞれのさまざまな長所と短所については、こちらの回答(およびその下のコメント) を参照してください。

于 2012-11-15T15:06:32.533 に答える