2017-09-29 8 views
-1

流暢なPythonの最初のプログラム。私はプログラムを簡素化した。python __init__ class属性、クラステストはいつ準備完了ですか?

class Test: 
    a = 15 
    def __init__(self): 
     self.att = a 

t = Test() 
print(t.att) 

それは動作しませんでした、と私は

self.att = Test.a 

を使用している場合、それは働きました。 TestクラスでもTest.aを常に使用する必要があるのはなぜですか? 私はjavaを学んだので、そうする必要はありません。

また別の問題があります。

class Test: 
    a = 15 
    def __init__(self, b=Test.a): 
     self.att = b 

t = Test() 
print(t.att) 

これは機能しませんでした。私はそのサイトを検索した。 その理由は次のとおりです。 デフォルトの引数は、関数の定義中に定義する必要があります。

そして

self.att = Test.a 

以降は働いていたので、機能の内容は、呼び出されるまで有効かチェックされるのですか?

私は正しいですか?

クラステストは#1の後で準備ができていますが、前には、呼び出される前に関数の内容をチェックしていないため、Test.aを使用しました。右?このようにアクセスすることの必要性などの

class Test: 
    a = 15 
    def __init__(self): 
     self.att = Test.a 
    #1 
t = Test() 
print(t.att) 
+0

https://docs.python.org/3/tutorial/classes.html#classes – wwii

答えて

1

メンバー:self.a(でも__init__方法で)

class Test: 
    a = 15 
    def __init__(self): 
     self.att = self.a 

t = Test() 
print(t.att) 
+0

をなぜ彼らは 'self.a'がアクセスする必要があるのですか? (推奨される回答の更新 - コメントは期待していません) – AK47

+0

ありがとうございます。私はこれがうまくいくのを知っていますが、なぜですか – alwayslz

1

私は、javaを学んだ、と私はそうする必要はありません。

しかし、あなたは、PythonとJavaの比較すれば、あなたはすべてのインスタンスメンバーのselfをプレフィックスする必要があることに気づくでしょうし、あなたが実際にすべての時間にそのself引数を取るためにあなたの方法を必要としています。したがって、ここではJavaの動作を実際に期待することはできません。

しかし、単にメソッドやインスタンス変数と同じように、あなたにもselfを使用してクラスメンバーにアクセスすることができます。__init__の実行時に

class Test: 
    a = 15 
    def __init__(self): 
     self.att = self.a 

selfはあなたのTestタイプのインスタンスを参照します。したがって、インスタンス上のすべてのものにアクセスするには、selfで行う必要があります。クラスメンバの場合、すべてのメンバーもインスタンス上に表示されます(インスタンスメンバーによって非表示になっている場合を除く)。self.aTest.aのように動作します。また、作成したインスタンスtt.aでこれを試すこともできます。インスタンスメンバーaがなくても動作します。

0

理由はオブジェクト作成時に__init__が実行されるためです。 __init__内に関数のスコープがありません。a変数が定義されていません。クラス内でaが定義されていることをどのように知っていますか?

Test.aと明記するときは、pythonにclass属性を使用するよう明示してください。 self.aを使用している場合、PythonはMROルックアッププロセスを使用してa属性を検索します。

class Test: 
    a = 15 
    def __init__(self): 
     self.att = self.a 
    #1 
t = Test() 
print(t.att) 
関連する問題