1

いくつかの変数セットに対するクラス メソッドのアクションは、対応する非クラス関数のアクションとは異なると思われます。ここに例があります。一連の変数 A、B、C があり、いくつかのアルゴリズムに従って時間の経過とともにそれらを変更したいとします。2 つの可能な実装があります。

1) クラス:

   class variables:
       def __init__(self):
           self.A = 0.0
           self.B = 0.0
           self.C = 0.0
       def changeA(self):
           self.A = some function of A, B and C         
       def changeB(self):
           self.B = some function of A, B and C
       def changeC(self):
           self.C = some function of A, B and C

そして何度も呼び出します:

    ob = variables()
    i = 0 
    while i<N:
        ob.changeA()
        ob.changeB()
        ob.changeC()
        i = i + 1

2) 授業なし

    A, B, C = 0.0, 0.0, 0.0
    def changeA(A,B,C):
        A = some function of A, B and C (same as in class method)
        return A
    def changeB(A,B,C):
        B = some function of A, B and C (same as in class method)
        return B
    def changeC(A,B,C):
        C = some function of A, B and C (same as in class method)
        return C

そして何度も呼び出します:

    i = 0 
    while i<N:
        A = changeA(A,B,C)
        B = changeB(A,B,C)
        C = changeC(A,B,C)
        i = i + 1

私の意見では、2 つのアプローチの結果は同じでなければなりません。唯一の違いは、変数 A、B、および C が既知である名前空間です (オブジェクト内のローカルまたは関数実装のグローバルのいずれか - ただし、どちらの場合も、メソッドは必要な変数にアクセスできます)。ただし、2 つの方法の結果は異なるようです。だから私の質問は、クラスメソッドの実装/理解に欠けているものはありますか?

具体的には、メソッド changeA の実装例:

クラスメソッドとして:

    (... inside the class)
    def changeA(self):
        self.A = self.A + 2.0*self.B - 3.0*self.C*(self.B-self.A)

関数として:

    def changeA(A,B,C):
        A = A + 2.0*B - 3.0*C*(B-A)
        return A
4

1 に答える 1

0

variables最初のケースでは、新しいインスタンスが作成されるたびにABの値Cがリセットされます。これは、グローバルであるように見える2番目のアプローチの場合とは異なります。これらのインスタンスの使用方法によっては、結果に影響を与える可能性があります。

編集:コメントでのOPの質問の後、クラス変数を定義する方法は次のとおりです。

>>> class Variables:
    A = 0.0
    B = 0.0
    C = 0.0

    def changeA(self):
           Variables.A = Variables.A + Variables.B * Variables.C


>>> v = Variables()
>>> v.changeA()
>>> v.A
0.0
>>> Variables.A
0.0
>>> 

ご覧のとおり、__init__メソッドを定義する必要はもうありません。instance.Aまた、またはのいずれかでこれらの変数にアクセスできますclass.A

于 2012-06-25T13:56:11.057 に答える