1

私は大量のコードを書いていますが、Python クラスとその関数で変数を使用する最善の方法について十分な経験がありません。そのため、意見を求めたいと思いました。これが私がそれを行う方法の例です

class MyClass():
    vara = 'Class Variable A'

    def __init__(self):
        self.varb = 'Class instantiation Variable B'

    def a(self):
        varc = 2
        vard = 3

        print 'def a function variables unchanged', varc, vard

        MyClass.vara = 'Class Variable A now changed by def a'

    def b(self):
        print self.varb
        self.varb = 'Class instantiation Variable B now changed by def b'
        print self.varb

if __name__ == "__main__":
    print MyClass.vara

    a = MyClass()
    a.a()
    a.b()

    print MyClass.vara

    a.a()

これにより、この結果が得られます

Class Variable A
def a function variables unchanged 2 3
Class instantiation Variable B
Class instantiation Variable B now changed by def b
Class Variable A now changed by def a
def a function variables unchanged 2 3

django の私のアプリは、約 25 の関数を持つクラスを使用しています。これはテスト アプリケーションであり、各関数は API 呼び出しを表します。各 API 呼び出しは、結果に基づいていくつかの変数を提供します。関数によって設定されたこれらの変数を他の関数で使用する必要があります。つまり、これらのローカル関数変数を他の関数で呼び出す必要があります。これを行うための最良の方法を知りたいです。

上記の例では、クラス内の関数を使用してクラス変数 vara を設定できます。これを行うMyClass.vara = 'something'か、インスタンス化コンストラクターにある変数を設定できます __init__。次に、任意の関数を使用してこれらの変数を呼び出すことができます。

より良い方法は何ですか、またはこれを行うためのさらに良い方法はありますか?

4

1 に答える 1

4

あなたが求めていることを完全に理解しているかどうかはわかりませんが、あなたのことを正しく理解していれば、答えはあなたが何をしたいかによるということです. varaクラス全体で 1 回保存する場合は、クラスに属性を ( のように) 設定する必要があります。インスタンスごとに個別の属性が必要な場合は、 __init__(のように)のインスタンスに設定する必要があります。varb

属性の値として変更可能なオブジェクト (リストなど) がある場合、違いはより明確になります。下記参照:

>>> class Foo(object):
...     classVar = []
...     def __init__(self):
...         self.instVar = []
>>> f = Foo()
>>> g = Foo()
>>> f.classVar
[]
>>> f.instVar
[]
>>> g.classVar
[]
>>> g.instVar
[]
>>> f.instVar.append(1)
>>> f.instVar
[1]
>>> g.instVar
[]
>>> f.classVar.append(1)
>>> f.classVar
[1]
>>> g.classVar
[1]

最後のビットでは、変異f.classVarも影響を受けることに注意してくださいg.classVar。これはクラス属性であるため、クラスのすべてのインスタンスで共有されます。インスタンス属性 ( instVar) は、インスタンスごとに独立しています。

于 2012-08-31T14:31:12.477 に答える