web-dev-qa-db-ja.com

Python selfとJava this

私は少し前にPythonを少しやりました。しかし、今はJavaに移行しています。 Python "self"メソッドとJava "this"の間に違いがあるかどうかを知りたかった。

「自己」はキーワードではなく、「これ」はキーワードであることを知っています。そして、それはほとんど私が理解できることです。他に何か不足していますか?

49
Bayko

Pythonのselfについて(ソースはここにあります: Pythonの自己説明 ):

selfを使用する必要がある理由。 Pythonは、インスタンス属性を参照するために@構文を使用しません。Pythonメソッドが属するインスタンスを作成する方法でメソッドを実行することにしました自動的に渡されますが、自動的に受信されません:メソッドの最初のパラメーターは、メソッドが呼び出されるインスタンスです。これにより、メソッドは関数とまったく同じになり、実際の名前は使用できます(ただしselfは慣習であり、他の何かを使用すると一般的に人々はあなたに眉をひそめます。)selfはコードにとって特別なものではなく、単なる別のオブジェクトです。

Pythonは、通常の名前と属性を区別するために何か他のことを行うことができます-Rubyのような特別な構文がある、またはC++やJava do、または何かのような宣言が必要ですPythonはすべてを明確にするためのものであり、何が何であるかを明確にするためのものであり、完全にどこでもそれを行うわけではありませんが、インスタンス属性に対してはそれを行います。どのインスタンスに割り当てるかを知る必要があるため、selfが必要です。

this in Java Oracleが説明しています(ソースはここにあります: Javaこの説明 ):

インスタンスメソッドまたはコンストラクター内では、thisは現在のオブジェクト(メソッドまたはコンストラクターが呼び出されるオブジェクト)への参照です。 thisを使用して、インスタンスメソッドまたはコンストラクター内から現在のオブジェクトの任意のメンバーを参照できます。 thisキーワードを使用する最も一般的な理由は、フィールドがメソッドまたはコンストラクターパラメーターによってシャドウされるためです。

まず第一に、あなたを修正させてください-selfはメソッドではありません。さらに進む:

技術的には、selfthisの両方が同じものに使用されます。これらは、現在のインスタンスに関連付けられた変数にアクセスするために使用されます。唯一の違いは、selfをPythonのインスタンスメソッドの最初のパラメーターとして明示的に含める必要があることですが、Javaの場合はそうではありません。さらに、名前selfは何でも構いません。既にご存じのとおり、これはキーワードではありません。それをthisに変更することさえでき、それはうまく機能します。しかし、人々はselfを使用するのが好きです。これは今や少し慣習になっているからです。

PythonとJavaの両方でインスタンス変数にアクセスする簡単なインスタンスメソッドです。

Python:

class Circle(object):
    def __init__(self, radius):
        # declare and initialize an instance variable
        self.radius = radius

# Create object. Notice how you are passing only a single argument.  
# The object reference is implicitly bound to `self` parameter of `__init__` method
circle1 = Circle(5);

Java:

class Circle {
    private int radius;

    public Circle(int radius) {
        this.radius = radius;
    }
}

Circle circle1 = new Circle(5);

以下も参照してください:

67
Rohit Jain

注意してくださいsuperはthis.iの独自バージョンをJavaで保持できますですが、self.iは常にPythonの子を参照しますです。

Main.Java:

class Parent {

    int i;
    Parent() {
        this.i = 5;
    }

    void doStuff() {
        System.out.println(this.i);
    }
}

class Child extends Parent {
    int i;
    Child() {
        this.i = 7;
    }
}

class Main {

    public static void main(String[] args) {
        Child m = new Child();
        System.out.println(m.i); //print 7
        m.doStuff(); //print 5
    }
}

Main.py:

class Parent(object):
    i = 5;
    def __init__(self):
        self.i = 5

    def doStuff(self):
        print(self.i)

class Child(Parent, object):

    def __init__(self):
        super(Child, self).__init__()
        self.i = 7

class Main():

    def main(self):
        m = Child()
        print(m.i) #print 7
        m.doStuff() #print 7

m = Main()
m.main()

出力:

$ Java Main 
7
5
$ python Main.py 
7
7

[更新]

理由は、JavaのChildクラスでのint i宣言により、iがクラススコープ変数になりますが、Python=サブクラス化ではそのような変数シャドーイングはありません。 JavaのChildクラスのint iを削除すると、7と7も出力されます。

12
林果皞

私の観点から、最も明らかな違いは、Javaクラスでは、コンストラクターで、フィールドを指定する必要があることです。

this.radius = radius

pythonコードでは、そうする必要はありませんが、暗黙的です。

1
Jason Cheng