の下にそれを使用する必要があります。
プログラムは、マシンに何をすべきかを伝える一連のコマンドであることに注意してください。プログラミング言語は、マシン固有の実装を知らなくても、それらのコマンドを整理して推論する方法を提供しますが、マシンが実行する前に変換する必要があります。言語に応じて、コンパイラを介して、またはインタープリタを介して、必要に応じて翻訳を一度に行うことができます。こうした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
それは醜いとなり、および/またはあなたが妥協する必要がありますので、私はおそらく代わりに、クラスの外でデフォルト値を宣言するといいと思ういずれかの方法。
それはこのように動作します: 'デフ__init __(自己、テスト=テスト):' – Harvey
@Harvey:答えとして、それが正しいと投稿してください。 – Blender
将来のインスタンスの作成時にデフォルトを変更するには、 'TEST.test'を変更しますか? – tdelaney