-2

私はずっと前に Java でコーディングしたことがあります。class キーワードがクラス内の任意のメソッド内でどのようにアクセスできるかを覚えています。

例、

int age
int xyz

public void abc(int aga,int xyz) {
    this.age = age;
    this.xyz = xyz;
}

上記のコードで this.agethis.xyz、クラス変数を参照しています。これら 2 つの変数はクラス変数であり、メソッドの外部で宣言されているabcため、これら 2 つの変数はクラス内のどこからでもアクセスできます。

さて、Python について話すと、

__init__Pythonのメソッドはコンストラクト__init__です。Java クラス変数と同じように、メソッド内で宣言されていても、クラス内のどこにでもアクセスできますか?

たとえば、次のコードを考えてみましょう。

Class Main:
     def __init__(self):
           self._age = None
           self._xyz = None

変数agexyzは内部__init__で宣言されていますが、クラスの他のメソッドでそれらにアクセスできますMainか? 私は答えがイエスであることを知っているかもしれませんが、なぜ答えがイエスなのですか? 変数はメソッド内で宣言され、クラス変数として宣言されていないため、他のメソッドや他のクラスからどのようにアクセスできますか。

4

3 に答える 3

3

いいえ。 __init__asで物事を定義するとself.xxx、それらはインスタンス属性になります。Python では、クラス属性は、メソッドの外側のクラスで単純に定義されます。

class MyClass(object):

    abc = 0
    xyz = 42

    def __init__(...)
        # and so on

self.abcこれらは、 という名前のインスタンス属性も存在しない限り、eg を使用して任意のメソッド内で到達できますabc。存在する場合、インスタンス属性が優先されます。この場合でも、を使用してクラス属性にアクセスできますtype(self).abc

于 2013-10-10T18:20:06.433 に答える
1

Python では、クラスはオブジェクトであり、「クラス属性」は実際にはクラス オブジェクト自体の属性を意味し、クラスのインスタンスの属性ではありません。現在、Python オブジェクトの構造は動的です。インスタンスごとにどこでも (メソッドの外であっても) 属性を追加 (または削除) できますが、Java クラスには固定の宣言された構造があります。 class ステートメントの本体でクラスの構造 (どの属性を持つか) を記述しますが、Python では通常、初期化子で行います。

于 2013-10-10T20:35:49.317 に答える