2

私は多くの答えを調べましたが、私が理解している答えが見つかりませんでした。これは私の実際のプログラムの問題に基づいたテストプログラムです。変更できるクラス変数が必要であり、その変更をクラスのすべてのインスタンスに適用しますが、同じ形式であっても同様のクラスには適用しません。

おそらく明らかなように、3行目でXのクラス変数を定義し、9行目でYのクラス変数を定義しています。23〜25行目でこれらにアクセスしようとしています。

私のモデルは

 #! /usr/bin/python -t
 class X:
      clsvar = "Animal"
      def show(self):
          clsvar
      def chg(self,creature):
          clsvar  = creature
 class Y:
      clsvar = "Plant"
      def show(self):
          clsvar
      def chg(self,creature):
          clsvar  = creature
 class A(X):
      pass
 class B(X):
      pass
 class C(Y):
      pass
 a = A()
 b = B()
 c = C()
 print "1 " + a.show()
 print "2 " + b.show()
 print "3 " + c.show()
 a.chg( "Dog")
 print "4 " + a.show()
 print "5 " + b.show()
 print "6 " + c.show()

私の結果は

Traceback (most recent call last):
  File "180.py", line 23, in ?
    print "1 " + a.show()
  File "180.py", line 5, in show
    clsvar
NameError: global name 'clsvar' is not defined

clsvarは派生クラスのいずれかに表示され、グローバルである必要はないと思いました。私は明らかにここで愚かですが、私は成功せずにこの数十の方法を試しました。

ちなみに、Rubyでこれを行うことができました。

 #! /usr/bin/ruby -w
 class X
      @@clsvar = "Animal"
      def self.show
          @@clsvar
      end
      def self.chg(creature)
          @@clsvar  = creature
      end
 end
 class Y
      @@clsvar = "Plant"
      def self.show
          @@clsvar
      end
      def self.chg(creature)
          @@clsvar  = creature
      end
 end
 class A < X
      A.show
 end
 class B < X
      B.show
 end
 class C < Y
      C.show
 end
 a = A
 b = B
 c = C
 puts "1 " + a.show 
 puts "2 " + b.show 
 puts "3 " + c.show 
 a.chg( "Dog")
 puts "4 " + a.show 
 puts "5 " + b.show 
 puts "6 " + c.show 

そして、出力は次のとおりです。

1 Animal

2 Animal

3 Plant

4 Dog

5 Dog

6 Plant
4

1 に答える 1

2

クラス変数にアクセスするには、次のようにする必要があります。

MyClass.clsvar

またはこれでも:

an_instance.clsvar

clsvar後者は、インスタンスに.(*)というインスタンス変数がない場合にのみ機能します。

Python は Java とは異なります。Java とは異なり、Pythonにはグローバル変数があることを考慮してください。例えば:

a = 1
class MyClass:
    a = 2
    def show(self):
        print(a)

このshowメソッドは、ではなく1グローバル変数を参照しているため、が出力されます。aMyClass.a


(*) これに関するメモ。MyClass.varを使ってアクセスできますしself.var、改変しなくても大丈夫です。ただし、値を設定することは同等ではありません。クラス変数を設定する場合は、MyClass.var = valueand notを使用する必要がありan_instance.var = valueます。後者はvarvaluevalueで呼び出される新しいインスタンス変数を作成するためMyClass.var、古い値のままです。


ちなみにRubyは詳しくないのですが、@@構文はクラス変数にアクセスするために使われているので、それで動くのだと思います。

最後に、あなたのコードは正しくありません。returnおそらく、これらのメソッドにいくつかのステートメントを入れたいと思うでしょう。そうしないとTypeError、実行時にいくつかの s が得られます。

于 2012-10-16T19:00:12.507 に答える