我早就做了一点Python。然而,我现在转向Java。我想知道Python“self”方法和Java“this”之间是否存在任何差异。
我知道“自我”不是关键字,而“这”是关键字。这几乎是我能想到的。我错过了什么吗?
答案 0 :(得分:63)
首先,让我纠正你 - self
不是一种方法。进一步:
从技术上讲,self
和this
都用于同一事情。它们用于访问与当前实例关联的变量。唯一不同的是,您必须将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);
爪哇:
class Circle {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
}
Circle circle1 = new Circle(5);
另见:
答案 1 :(得分:30)
关于Python中的self
(此处为来源:Python self explanation):
您需要使用 self 的原因。是因为Python不使用@语法来引用实例属性。 Python决定以某种方式执行方法,使得方法所属的实例自动传递,但不会自动传递:方法的第一个参数是调用该方法的实例。这使方法与函数完全相同,并保留实际名称以供您使用(尽管 self 是惯例,当您使用其他内容时,人们通常会对您不满。) self 对代码并不特殊,它只是另一个对象。
Python本可以做其他事情来区分普通名称和属性 - 像Ruby这样的特殊语法,或者需要像C ++和Java这样的声明,或者可能是更不同的东西 - 但事实并非如此。 Python的所有内容都是为了使事情变得明确,让它显而易见的是什么,虽然它并不是完全在任何地方完成,但它确实是为了实例属性。这就是为什么分配一个实例属性需要知道要分配的实例,这就是为什么它需要 self ..
Oracle解释Java中的this
(此处为来源:Java this explanation):
在实例方法或构造函数中, this 是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。 使用 this 关键字的最常见原因是因为字段被方法或构造函数参数遮蔽。
答案 2 :(得分:11)
小心 super可以在Java中保留自己的this.i版本,但是 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
<强> [更新] 强>
原因是因为int i
类中的Java Child
声明使i
成为类范围变量,而Python子类中没有这样的变量阴影。如果删除int i
类Java中的Child
,它也会打印7和7。
答案 3 :(得分:1)
从我的角度来看,最明显的区别是在Java类中,在构造函数中,您需要指定字段
this.radius = radius
虽然在python代码中,您不必这样做,但它是隐式的。