2017-05-12 7 views
0

をクラス変数を使用する方法:クラス内でインスタンスの

class TEST: 
    test = 'a' 
    def __init__(self, test=TEST.test): 
     self.test=test 
    def resetTest(self): 
     self.test=TEST.test 

それから私はエラーを次しまっ:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in TEST 
NameError: name 'TEST' is not defined 

はどのようTESTクラス内クラス変数testを使用することができますか?

+1

それはこのように動作します: 'デフ__init __(自己、テスト=テスト):' – Harvey

+1

@Harvey:答えとして、それが正しいと投稿してください。 – Blender

+0

将来のインスタンスの作成時にデフォルトを変更するには、 'TEST.test'を変更しますか? – tdelaney

答えて

0

これを行うには、少なくとも2つの方法があります。

だけTEST.

代わりの削除:

TEST.test 

入れ:__init__()で引数として

test 

を。

def __init__(self, test=test): 
    self.test = test 
... 

あなたは両方、testself.testを使用することができ、ここで、あなたはおそらく両方を望んでいないので、ちょうどself.test = testをしないことに注意してください。それとも...


あなたが投稿したコードは、おそらく単なる例であるが、この場合には私はどうなる:def __init__(self, test='a'): ...あなたは、ほぼすべての状況を何しています。

1

あなたはのは、完全にここで何が起こっているか理解するためにいくつかの背景を見てみましょうのような

class TEST: 
    test = 'a' 
    def __init__(self): 
     pass 
    def resetTest(self): 
     print self.test 
     print TEST.test 

t = TEST() 
t.resetTest() 
1

の下にそれを使用する必要があります。

プログラムは、マシンに何をすべきかを伝える一連のコマンドであることに注意してください。プログラミング言語は、マシン固有の実装を知らなくても、それらのコマンドを整理して推論する方法を提供しますが、マシンが実行する前に変換する必要があります。言語に応じて、コンパイラを介して、またはインタープリタを介して、必要に応じて翻訳を一度に行うことができます。こうしたC、移動、またはHaskellは事前にあなたのコード全体を変換し、変換された命令のすべてと出力新しいファイルするコンパイラを使用するよう

Compiled languages。このようにして、多くの場合、最終的に定義されている限り、コンパイラは順序の異なる参照を解決します。 Python、Bash、Rubyのような(またはスクリプトの言語)は、コードを1つずつ読み込んで先読みせずに即座に実行するために、インタプリタpython実行可能ファイルなど)を使用します。

例では、class宣言は1つの「ピース」とみなされ、クラス本体全体が解析されるまでインタープリタがアクセス可能な変数として登録されません。TEST__init__方法にあなたのトレースバックポイント

注:この時点でクラスを定義するの真ん中にいるので

def __init__(self, test=TEST.test): 
    self.test=test 

は、インタプリタは、このように、まだそれについて知っていません。

NameError: name 'TEST' is not defined 

TL;インタプリタが、それはデフォルトはからtestパラメータのことになっているものは何でもキャッシュできるので、すぐにTEST.testを解決しようとしているので、DRにのみ発生します関数宣言。だから、あなたがこのようなクラスのインスタンスを作成するまで、それは呼び出されませんので、関数本体自体の内部リファレンスを移動するために完全に安全次のようになります。

class TEST: 
    test = 'a' 

    def __init__(self, test=None): 
     if test is not None and test != TEST.test: 
      self.test = test 

    def resetTest(self): 
     self.test=TEST.test 

ます。また、スーパークラスでは、デフォルトの変数を入れることができます:

class BaseTEST: 
    test = 'a' 

class TEST(BaseTEST): 

    def __init__(self, test=BaseTEST.test): 
     self.test = test 

    def resetTest(self): 
     self.test = BaseTEST.test 

それは醜いとなり、および/またはあなたが妥協する必要がありますので、私はおそらく代わりに、クラスの外でデフォルト値を宣言するといいと思ういずれかの方法。

0
私はそれがメンバ変数をリセットすることはできませんだと思う

self.test=TEST.test

の意味は何

... そして、あなたは「」

0

クラス変数であるために、2つの「TEST.test」を変更することができますメソッド定義からローカルスコープでアクセスできる(TEST.は必須)が、メソッド本体からはアクセスできません。だから、これはあなたの例を記述するための正しい方法のようになります。

class TEST: 
    # even for an example, this should be named something like default_test. 
    test = 'a' 

    def __init__(self, test=test): # can see TEST.test without the classname 
     self.test=test 

    def resetTest(self): 
     self.test=TEST.test   # needs the class name to see TEST.test 

いくつかのテスト:

In [23]: TEST.test 
Out[23]: 'a' 

In [24]: t = TEST() 

In [25]: t.test, TEST.test 
Out[25]: ('a', 'a') 

In [26]: t2 = TEST(123) 

In [27]: t2.test, TEST.test, t.test 
Out[27]: (123, 'a', 'a') 

In [28]: t2.resetTest() 

In [29]: t2.test, TEST.test, t.test 
Out[29]: ('a', 'a', 'a') 
関連する問題