7

以下の例を試してみましたが、説明が必要です。どちらの場合も、テスト関数でクラス変数とインスタンスにアクセスできます。

したがって、すべての関数で使用する必要があるリテラルを定義する必要がある場合、自己変数またはクラス変数を定義するより良い方法はどれでしょうか?

コード.py

class testclass:
    classvar = 'its classvariable LITERAL'
    def __init__(self,x,y):
        self.z = x
        self.classvar = 'its initvariable LITERAL'

        self.test()

    def test(self):
        print('class var',testclass.classvar)
        print('instance var',self.classvar)

if __name__ == '__main__':
    x = testclass(2,3)
4

4 に答える 4

6

クラス変数は、すべてのインスタンスで使用される「定数」に非常に適しています(つまり、すべてのメソッドが技術的に使用されます)。モジュールグローバルを使用することもできますが、クラス変数を使用すると、クラスとの関連付けがより明確になります。

実際に変更するクラス変数の使用法もよくありますが、グローバル変数を変更してプログラムのさまざまな部分を通信させないようにするのと同じ理由で、通常はそれらを使用しないことをお勧めします。

インスタンス変数は、実際にはインスタンスの一部であるデータ用です。それらは特定のインスタンスごとに異なる可能性があり、単一の特定のインスタンスの存続期間中に変更されることがよくあります。プログラムにインスタンスが1つしかない場合や、実際には常に同じ値を持つインスタンスがいくつかある場合でも、概念的にインスタンスの一部であるデータにはインスタンス変数を使用するのが最適です。

于 2012-09-30T01:56:29.547 に答える
5

クラス属性が固定されている場合にのみ使用することをお勧めします。クラス属性の優れた点の 1 つは、インスタンスの外部からアクセスできることです。

class MyClass():
    var1 = 1
    def __init__(self):
        self.var2 = 2

MyClass.var1 # 1 (you can reference var1 without instantiating)
MyClass.var2 # AttributeError: class MyClass has no attribute 'var2'

が定義されている場合MyClass.var、 のすべてのインスタンスで同じである必要がありますMyClass。それ以外の場合は、混乱を招くと見なされる次の動作が発生します。

a = MyClass()
b = MyClass()

a.var1, a.var2 # (1,2)
a.var1, a.var2 = (3,4) # you can change these variables
a.var1, a.var2 # (3,4)
b.var1, b.var2 # (1,2) # but they don't change in b
MyClass.var1 # 1         nor in MyClass
于 2012-09-30T02:01:20.520 に答える
4

すべてのインスタンスで共有する場合は、クラス属性として定義する必要があります。インスタンスごとに個別の変数が必要な場合は、インスタンス変数として定義する必要があります (たとえば、インスタンスごとに変数の値が異なる場合)。

于 2012-09-30T01:13:36.647 に答える