2014-02-11 35 views
30

我已經做了一些Python的後面。然而,我現在轉向Java。我想知道Python「self」方法和Java「this」之間是否有區別。Python自己和Java的區別這個

我知道「self」不是「this」時的關鍵字。而這正是我所能想到的。我錯過了什麼嗎?

+2

你是什麼意思的「自我方法」? –

+0

您也不必將'self'(或Java的情況下,'this')作爲Java中類方法的第一個參數。 –

回答

18

Python的自我(這裏是源:Python self explanation):

你需要使用自我原因。是因爲Python不使用@語法來引用實例屬性。 Python決定以一種方式執行方法,使方法所屬的實例自動傳遞,但不自動接收:方法的第一個參數是方法被調用的實例。這使得方法完全一樣的功能,並且留下最多使用您的實際名稱(雖然自我是慣例,人們一般會在你皺眉的時候,你用別的。)是不是特別的代碼,它只是另一個對象。

的Python可以做別的事情要區分正常的屬性名稱 - 特殊的語法像Ruby有,或需要申報,如C++和Java做的,或者是某事更多不同 - 但它沒有。 Python將所有東西都明確地表達出來,明確了什麼是什麼,雖然它並不是完全在任何地方完成,但它確實可以用於實例屬性。這就是爲什麼在被指派給實例屬性需要知道分配給什麼情況下,這就是爲什麼它需要 ..

Java的這種解釋被甲骨文(這裏是源:Java this explanation):

在實例方法或構造函數中,這個是對當前對象的引用 - 該對象的方法或構造函數被調用。您可以使用這個來從實例方法或構造函數中引用當前對象的任何成員。 使用這個關鍵字的最常見原因是因爲字段被方法或構造函數參數遮蔽。

42

首先,讓我糾正你 - 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); 

參見:

+5

謝謝,比複製/粘貼接受的答案更有幫助,恕我直言 –

+0

謝謝 - 非常有幫助的答案,因爲它比較兩個並排。 – Stelios

+0

如果有一個現有的python方法沒有self作爲第一個參數,因爲Author不需要訪問實例的屬性,並且稍後決定將其添加回去,這是否會引入任何向後不兼容?我假設沒有,因爲每個Python方法自動傳遞自我實例。 – asgs

7

小心超能保持其自身的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的int i聲明中Child類使得i成爲類範圍變量,而在Python子類沒有這樣的變量陰影。如果您在Child類中刪除int i,則它也會打印7和7。