2014-02-11 17 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。