1

オブジェクト指向 Python を学習しようとしていますが、オブジェクト属性がインスタンス化された後のスコープについて疑問があります。そこで、非常に単純なプログラムを作成することにしました。

class Struct:
    def __init__(self):
        self.resadd=[]
        self.ressub=[]
        self.resmul=[]

class MathStruct:
    def mathss(self,x,y):
        add=x+y
        sub=x-y
        mul=x*y
        resstruct.resadd.append(add)
        resstruct.ressub.append(sub)
        resstruct.resmul.append(mul)

if __name__=='__main__':
    resstruct=Struct()
    for i in range(10,20):
        mathsstuff=MathStruct()
        mathsstuff.mathss(i,5)
    print len(resstruct.resadd),resstruct.resadd
    print len(resstruct.ressub),resstruct.ressub
    print len(resstruct.resmul),resstruct.resmul

ご覧のとおり、プログラムは非常に単純ですが、ここで質問があります。resstruct=Struct() を使用して「結果」オブジェクトをインスタンス化し、次に resstruct.resadd、resstruct.ressub、および resstruct.resmul 属性を使用します。 「数学」関数。これは合法ですか(正しい答えが得られます!)?これは、他の関数内でもオブジェクトの属性を使用できるということですか?

通常、関数から値を返し、それを object 属性に追加しますが、別の関数内で object 属性を直接変更できることに (嬉しいことに) 驚きました。

..一言で言えば、私の質問は、インスタンス化された後のオブジェクト属性のスコープは何ですか? これが101の質問である場合は申し訳ありません。

4

1 に答える 1

4

この行restruct = Struct()は、関数またはクラスの外側のモジュールのトップ レベルで発生するため、モジュールのグローバル名前空間にオブジェクトが作成されます。この名前空間は、その用語が示すように、モジュールに対してグローバルであり、すべての関数からアクセスできます。関数内で行っrestruct = Struct()た場合、それはグローバルではなく、関数が終了すると消えます。

つまり、関数スコープで作成した場合、オブジェクトの有効期間はそのスコープに制限されます。ただし、グローバル スコープで作成したため、永久に存続します。(オブジェクトの属性自体にはスコープがありません。それらはそのオブジェクト自身のインスタンス名前空間内にあり、オブジェクトを介してのみアクセスできます。アクセスできるobj.attrときはいつでもアクセスできますobj。)

(ただし、関数内からグローバル変数に代入するには、ステートメントが必要であることに注意してください。変数の値を読み取り、そのオブジェクトをメソッドで変更するだけなのでglobal、アクセスできます。関数内で代入しようとすると、グローバル変数をシャドウする新しいローカル変数を作成します。)restructrestruct

于 2012-12-03T19:50:46.887 に答える