1

私はPython2.7のプログラムに取り組んでいて、同じクラス内のパラメーターとしてPythonクラスフィールドを渡そうとしていることに気づきました。コードをよりクリーンにするために(そしてそれによってこの構造の必要性を排除するために)コードを変更しましたが、それでも興味があります。

いくつかの例(非常に単純化されていますが、概念は存在します):

[注:例1と2の場合、数値を入力として取得してインクリメントするか、現在の値をインクリメントしたいとします。]

例1。

class Example:
    def __init__(self,x):
        self.value = x
    def incr(self,x=self.value):
        self.value = x + 1

結果:

"NameError: name 'self' is not defined"

例2。

class Example:
    def __init__(self,x):
        self.value = x
    def incr(self,x=value):
        self.value = x + 1

結果:

"NameError: name 'value' is not defined"

例3。

class Example:
    def __init__(self,x):
        ex2 = Example2()
        self.value = ex2.incr(x)
    def get_value(self):
        return self.value

class Example2:
    def __init__(self):
        self.value = 0
    def incr(self,x):
        return x + 1

ex = Example(3)
print ex.get_value()

結果:

4

質問を言い換えると、Pythonクラスフィールドをパラメーターとして独自のメソッドに渡せないのはなぜですか?

他にご不明な点がある場合や、さらに詳しい情報が必要な場合はお知らせください。ありがとう!

4

1 に答える 1

4

メソッドのデフォルト値は、メソッドが呼び出されたときではなく、メソッドが定義されたときに評価されます。その時点でクラスはまだ定義されているため、そのタイプのオブジェクトは存在しません。したがって、は使用できませんself

メソッド内でデフォルト値を設定Noneし、これをテストするという回避策を使用できます。

def incr(self,x=None):
    if x is None:
        x = self.value
    self.value = x + 1
于 2012-08-03T22:18:34.983 に答える